您的位置:首页 > 其它

POJ 2488 A Knight's Journey 【dfs + 思维】

2018-02-26 23:19 204 查看
传送门

// 题意: 给定一个n*m的棋盘, 问是否有一种方式可以使这匹马走遍这个棋盘的每一个点, 有的话打印出路径, 并且字典序要尽可能的小.

思路: 可能难点的地方就是字典序那, 其实不用管, 因为如果我们从除(1, 1)的点走完全程, 那为啥不从(1, 1)出发这个再是字典序最小的呀, 所以我们直接从(1, 1)开始搜就OK啦, 然后因为字典序的原因8个方向有一定的顺序, 然后只要能搜出答案就一定是ans.

注意就是存路径的方式, 最好不要用记录前驱的方法, 这样比较难处理, 具体请看代码.

AC Code

const int maxn = 25 + 5;
int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};
int dy[] = {-1, 1, -2, 2, -2, 2, -1, 1};
int n, m;
int f[maxn*maxn][2], vis[maxn][maxn];
int flag;
void dfs(int x, int y, int deep) {
if (!flag) return ;
f[deep][0] = x; // 这样就可以把每一步存下来啦~
f[deep][1] = y;
if (deep == n*m) {
for (int i = 1 ; i <= deep ; i ++) {
printf("%c%d", f[i][0]+'A'-1, f[i][1]);
}
printf("\n\n");
flag = 0;
return ;
}
for (int i = 0 ; i < 8 ; i ++) {
int xx = x + dx[i];
int yy = y + dy[i];
if (xx < 1 || xx > n || yy < 1 || yy > m) continue;
if (vis[xx][yy]) continue;
vis[xx][yy] = 1;
dfs(xx, yy, deep+1);
vis[xx][yy] = 0;
}
}
void solve()
{
scanf("%d%d", &m, &n);
flag = 1; Fill(vis, 0);
vis[1][1] = 1; dfs(1, 1, 1);
if (flag) printf("impossible\n\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: