本站遷移

因為我最近租用了網路空間以及網域,
故本站已遷移至新網站~
這邊的資訊已經正在進行搬移的工作~
希望各位可以到新網站去逛XD

New Website:
http://knightzone.org/

搜尋此網誌

2011年3月7日 星期一

[UVa]439:Knight Moves

八種可能的走法去BFS得解。

[C](0.012)
#include<stdio.h>
int main()
{
char start[5], finish[5];
while( scanf( "%s%s", start, finish ) != EOF )
{
int startrow = start[1]-'1';
int startcol = start[0]-'a';
int finishrow = finish[1]-'1';
int finishcol = finish[0]-'a';
if( startrow == finishrow && startcol == finishcol )
{
printf( "To get from %s to %s takes 0 knight moves.\n", start, finish );
continue;
}
int label[10][10] = {0};
int BFS[100][3] = {0}, bfs_num = 0;
BFS[bfs_num][0] = startrow;
BFS[bfs_num][1] = startcol;
BFS[bfs_num][2] = 0;
bfs_num++;
int i;
int answer = 0;
for( i = 0 ; i < bfs_num ; i++ )
{
int y = BFS[i][0];
int x = BFS[i][1];
int step = BFS[i][2];
if( ((x+1 == finishcol) && (y+2 == finishrow)) ||
((x-1 == finishcol) && (y+2 == finishrow)) ||
((x+1 == finishcol) && (y-2 == finishrow)) ||
((x-1 == finishcol) && (y-2 == finishrow)) ||
((x+2 == finishcol) && (y+1 == finishrow)) ||
((x-2 == finishcol) && (y+1 == finishrow)) ||
((x+2 == finishcol) && (y-1 == finishrow)) ||
((x-2 == finishcol) && (y-1 == finishrow)) )
{
answer = step+1;
break;
}
if( x+1 < 8 && y+2 < 8 && !(label[y+2][x+1]) )
{
BFS[bfs_num][0] = y+2;
BFS[bfs_num][1] = x+1;
BFS[bfs_num][2] = step+1;
label[y+2][x+1] = 1;
bfs_num++;
}
if( x-1 >= 0 && y+2 < 8 && !(label[y+2][x-1]) )
{
BFS[bfs_num][0] = y+2;
BFS[bfs_num][1] = x-1;
BFS[bfs_num][2] = step+1;
label[y+2][x-1] = 1;
bfs_num++;
}
if( x+1 < 8 && y-2 >= 0 && !(label[y-2][x+1]) )
{
BFS[bfs_num][0] = y-2;
BFS[bfs_num][1] = x+1;
BFS[bfs_num][2] = step+1;
label[y-2][x+1] = 1;
bfs_num++;
}
if( x-1 >= 0 && y-2 >= 0 && !(label[y-2][x-1]) )
{
BFS[bfs_num][0] = y-2;
BFS[bfs_num][1] = x-1;
BFS[bfs_num][2] = step+1;
label[y-2][x-1] = 1;
bfs_num++;
}
if( x+2 < 8 && y+1 < 8 && !(label[y+1][x+2]) )
{
BFS[bfs_num][0] = y+1;
BFS[bfs_num][1] = x+2;
BFS[bfs_num][2] = step+1;
label[y+1][x+2] = 1;
bfs_num++;
}
if( x-2 >= 0 && y+1 < 8 && !(label[y+1][x-2]) )
{
BFS[bfs_num][0] = y+1;
BFS[bfs_num][1] = x-2;
BFS[bfs_num][2] = step+1;
label[y+1][x-2] = 1;
bfs_num++;
}
if( x+2 < 8 && y-1 >= 0 && !(label[y-1][x+2]) )
{
BFS[bfs_num][0] = y-1;
BFS[bfs_num][1] = x+2;
BFS[bfs_num][2] = step+1;
label[y-1][x+2] = 1;
bfs_num++;
}
if( x-2 >= 0 && y-1 >= 0 && !(label[y-1][x-2]) )
{
BFS[bfs_num][0] = y-1;
BFS[bfs_num][1] = x-2;
BFS[bfs_num][2] = step+1;
label[y-1][x-2] = 1;
bfs_num++;
}
}
printf( "To get from %s to %s takes %d knight moves.\n", start, finish, answer );
}
return 0;
}
view raw UVa439.c hosted with ❤ by GitHub

0 意見:

張貼留言