【POJ】2488 - A Knight's Journey dfs+回溯
2018-02-26 22:52
225 查看
http://poj.org/problem?id=2488
给一个大小不超过8*8的棋盘,现希望从任意一格出发,按照日走法不重复的遍历整个棋盘,输出字典序列最小输出。若不行输出impossible。
注意:①因要按字典序最小输出,所以从A1开始,因为从任意点出发总会经过A1.
②还是因为字典序最小,要注意方向数组的顺序,先想字典序小的方向出发。
给一个大小不超过8*8的棋盘,现希望从任意一格出发,按照日走法不重复的遍历整个棋盘,输出字典序列最小输出。若不行输出impossible。
注意:①因要按字典序最小输出,所以从A1开始,因为从任意点出发总会经过A1.
②还是因为字典序最小,要注意方向数组的顺序,先想字典序小的方向出发。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int T,n,m; bool flag; int dir[8][2]={-2,-1 , -2,1 , -1,-2 , -1,2 , 1,-2 , 1,2 , 2,-1 , 2,1}; bool vis[30][30]; struct Path{ int x; int y; }p[30]; void dfs(int x,int y,int step){ if (flag){ return; } p[step].x=x; p[step].y=y; if (step==n*m){ flag=1; return; } for (int i=0;i<8;i++){ int tx=x+dir[i][0]; int ty=y+dir[i][1]; if (tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]){ vis[tx][ty]=1; dfs(tx,ty,step+1); vis[tx][ty]=0; } } return; } int main(){ scanf("%d",&T); for (int t=1;t<=T;t++){ scanf("%d%d",&m,&n); memset(vis,0,sizeof(vis)); memset(p,0,sizeof(p)); flag=0; vis[1][1]=1; dfs(1,1,1); printf("Scenario #%d:\n",t); if (flag){ for (int i=1;i<=n*m;i++){ printf("%c%d",p[i].x+'A'-1,p[i].y); } printf("\n"); } else{ printf("impossible\n"); } if (t!=T){ printf("\n"); } } }
相关文章推荐
- POJ_2488: A Knight's Journey
- POJ 2488 A Knight's Journey(DFS)
- poj 2488 A Knight's Journey
- POJ 2488 A Knight's Journey
- POJ 2488 A Knight's Journey (DFS)
- poj 2488(dfs)
- poj 2488 A Knight's Journey
- poj 2488:A Knight's Journey
- POJ-2488-A Knight's Journey
- POJ 2488 A Knight's Journey
- POJ2488——A Knight's Journey
- POJ 2488(dfs+字典序)
- poj 2488 A Knight's Journey 水DFS
- POJ 2488:A Knight's Journey
- 【POJ 2488】 A Knight's Journey
- POJ 2488
- POJ 2488
- poj 2488 深度优先遍历
- POJ 2488解题报告
- poj 2488:A Knight's Journey