您的位置:首页 > 其它

POJ-2488 国际象棋马的走法 (深度优先搜索和回溯)

2017-07-03 22:16 525 查看
#include <stdio.h>
#define MAX 27
void dfs(int i, int j);

int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
int marked[MAX][MAX];   //标记
int pathx[MAX];
int pathy[MAX];
int flag, step;
int p,q;

int main(void) {
int n;
int i = 0;
int j, k;

scanf("%d", &n);
while (i++ < n) {
scanf("%d%d", &p, &q);
for (j = 1; j <= p; j++) {
for (k = 1; k <= q; k++)
marked[j][k] = 0;
}
flag = 0;
step = 0;
dfs(1, 1);      //从(A, 1)开始搜索

printf("Scenario #%d:\n", i);
if (flag) {
for (j = 1; j <= p * q; j++)
printf("%c%d", pathy[j] + 'A' - 1, pathx[j]);
printf("\n");
}
else
printf("impossible\n");
printf("\n");
}

}

void dfs(int i, int j) {
int x, y;
int k;
if (flag == 1)  return;

marked[i][j] = 1;         //标记

step++;
pathx[step] = i;
pathy[step] = j;

if (step == p * q)
{
flag = 1;
return;
}

//注意:二维数组和棋盘的坐标x, y是反的
for (k = 0; k < 8; k++) {
x = i + dx[k];
y = j + dy[k];
if (marked[x][y] != 1 && x <= p && x>= 1 && y <= q && y >= 1) {
dfs(x, y);
step--;         //走错了回退时步数-1
}
}
marked[i][j] = 0;       //撤销标记
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: