这真是一个很坑爹的题目,其实题目意思很简单就是骑士像象棋里面的马走日字,不能走重复的点并且必须走完所有的点。输出必须按字典顺序。横坐标用字符,‘A’,'B','C'......纵坐标用数字。题目就是Dfs很悲剧的是我把数组弄反了WA了n次,最后找出来我有点想撞墙的冲动啊!继续搜索啊!
代码:
#include<stdio.h>
#include<stdlib.h>
int r,c,px[50],py[50],visit[100][100],ok,n;
int dy[8] = {-1,1,-2,2,-2,2,-1,1};
int dx[8] = {-2,-2,-1,-1,1,1,2,2};
int isok(int x,int y)
{
return x >= 1 && x <= r && y >= 1 && y <= c;
}
void dfs(int x,int y,int length)
{
px[length] = x;
py[length] = y;
if(length == r*c){
ok = 1;
return;
}
for(int i = 0;i < 8;i++){
int tx = x + dx[i];
int ty = y + dy[i];
if(isok(tx,ty) && !visit[tx][ty] && !ok){
visit[tx][ty] = 1;
dfs(tx,ty,length+1);
visit[tx][ty] = 0;//巧妙,也是必须的
}
}
}
int main()
{
scanf("%d",&n);
for(int i =1;i <= n;i++){
scanf("%d%d",&c,&r);
visit[1][1] = 1;
ok = 0;
dfs(1,1,1);
printf("Scenario #%d:\n",i);
if(ok){
for(int j = 1;j <= r*c;j++){
printf("%c",px[j]+'A'-1);
printf("%d",py[j]);
}
}
else printf("impossible");
printf("\n\n");
}
system("pause");
return 0;
}