■

- 出版社/メーカー: 角川ゲームス
- 発売日: 2011/03/31
- メディア: Video Game
- 購入: 18人 クリック: 703回
- この商品を含むブログ (180件) を見る
■
// align.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <vector> template<int width> class v :public std::vector<int>{ public: v(int n){ resize(width*n); } int * operator [] (int n){ return &at(n*width); } }; int _tmain(int argc, _TCHAR* argv[]) { v<2> x(2); int i = x[0][0]; x[0][0] = 1; x[0][1] = 2; x[1][0] = 3; x[1][1] = 4; return 0; }
-
-
- -
-
// align.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <vector> class v :public std::vector<int>{ public: int width; v(int w,int h) :width(w) { resize(w*h); } int * operator [] (int n){ return &at(n*width); } }; int _tmain(int argc, _TCHAR* argv[]) { v x(2,2); int i = x[0][0]; x[0][0] = 1; x[0][1] = 2; x[1][0] = 3; x[1][1] = 4; return 0; }
ソース
家に手頃なLinux環境がなかったのでVisual Studio 2008体験版を落とした
zの袋小路の刈り取りは、狩り取れなくなるまで、やるべきだけど、面倒なので2でスキップ。
本当はほかと同じでmemcmpで前回と差がなくなるまで回すと総当たりでよろし
// route.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
enum {
BLOCK = -1,
START = 1,
END = -2,
CRLF = -3,
WALK = -4
};
#define READMAX 50
void walk(int *dst,int src){
if(*dst == 0 ){
*dst = src+1;
}
if(*dst > src+1){
*dst = src + 1;
}
}
int map[READMAX][READMAX] ;
int map2[READMAX][READMAX] ;
int line = 0;
void print(){
for(int y = 0 ; y < line ; y++)
{
for(int x = 0 ; x < READMAX ; x++)
{
switch(map[y][x]){
case BLOCK:
printf(" * ");
break;
case START:
printf(" S ");
break;
case END:
printf(" G ");
break;
case WALK:
printf(" $ ");
break;
case CRLF:
printf("\n");
x = READMAX;
break;
case 0:
printf(" ");
break;
default:
printf("%2x ",map[y][x]);
break;
}
}
}
}
void printAns(){
for(int y = 0 ; y < line ; y++)
{
for(int x = 0 ; x < READMAX ; x++)
{
switch(map[y][x]){
case BLOCK:
printf("*");
break;
case START:
printf("S");
break;
case END:
printf("G");
break;
case WALK:
printf("$");
break;
case CRLF:
printf("\n");
x = READMAX;
break;
case 0:
default:
printf(" ");
break;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
memset(map,0,sizeof(map));
//Read in data
while(true){
char buf[READMAX];
int i;
char * ret = fgets(buf,READMAX,stdin);
if(ret==NULL){
break;
}
if(buf[0]==0x04){
break;
}
int len = strlen(buf);
for(i = 0 ; i < len ; i++){
if(buf[i]=='*'){
map[line][i] = BLOCK;
}else
if(buf[i]=='S'){
map[line][i] = START;
}else
if(buf[i]=='G'){
map[line][i] = END;
}else{
map[line][i] = 0;
}
}
map[line][i] = CRLF;
line++;
}
int steps = 0;
//walking all route.
while(true){
printf("Step %d \n",++steps);
memcpy(map2,map,sizeof(map));
for(int y = 1 ; y < line -1 ; y++)
{
for(int x = 1 ; x < READMAX-1 ; x++)
{
if(map[y][x] == 0){
continue;
}
if(map[y][x] == BLOCK){
map2[y][x]=map[y][x];
continue;
}
if(map[y][x] == CRLF){
map2[y][x]=map[y][x];
break;
}
if(map[y][x] == END){
map2[y][x]=map[y][x];
continue;
}
walk(&map2[y-1][x ],map[y][x]);
walk(&map2[y ][x-1],map[y][x]);
//walk(&map2[y ][x ],map[y][x]);
walk(&map2[y ][x+1],map[y][x]);
walk(&map2[y+1][x ],map[y][x]);
}
}
if(memcmp(map,map2,sizeof(map))==0){
break;
}
memcpy(map,map2,sizeof(map));
print();
}
memcpy(map,map2,sizeof(map));
//check min route.
for(int z = 0 ; z < 2 ; z ++){
for(int y = 1 ; y < line -1 ; y++)
{
for(int x = 1 ; x < READMAX-1 ; x++)
{
if(map[y][x] <= 1){
continue;
}
if( map[y-1][x] == END ||
map[y ][x-1] == END ||
map[y+1][x] == END ||
map[y ][x-1] == END
){
continue;
}
if(!(
map[y-1][x] == map[y][x]-1 ||
map[y ][x-1] == map[y][x]-1 ||
map[y+1][x] == map[y][x]-1 ||
map[y ][x+1] == map[y][x]-1))
{
map[y][x] = 0;
continue;
}
if(!(
map[y-1][x] == map[y][x]+1 ||
map[y ][x-1] == map[y][x]+1 ||
map[y+1][x] == map[y][x]+1 ||
map[y ][x+1] == map[y][x]+1))
{
map[y][x] = 0;
continue;
}
}
}
}
printf("Minimum route \n");
print();
//walk start to end ... no end to start haha.
for(int y = 1 ; y < line -1 ; y++)
{
for(int x = 1 ; x < READMAX-1 ; x++)
{
if(map[y][x] != END){
continue;
}
//found goal.
while(true){
int min = 0x7FFFFFFF;
//find old step.
if(min > map[y-1][x] && map[y-1][x]>0) min = map[y-1][x];
if(min > map[y][x-1] && map[y ][x-1]>0) min = map[y][x-1];
if(min > map[y+1][x] && map[y+1][x]>0) min = map[y+1][x];
if(min > map[y][x+1] && map[y ][x+1]>0) min = map[y][x+1];
//move to old.
if(min == map[y-1][x] ) y--;
else if(min == map[y ][x-1] ) x--;
else if(min == map[y+1][x] ) y++;
else if(min == map[y ][x+1] ) x++;
if(map[y][x] == START){
x = y = READMAX;
break;
}
map[y][x] = WALK;
print();
}
}
}
//memcpy(map,map2,sizeof(map));
printf("result \n");
printAns();
getchar();
return 0;
}
ちなみに、スタックを使っても良ければ、前回移動した場所を覚えて、そこだけ再評価すると早い。
また、となりがゴールだったら、そこで評価を辞めても大概の場合は良い。ワープでも無い限りは、それが最短だから。


