poj 2488 dfs(骑士环游世界)
2012-01-18 01:16
393 查看
这是我在新浪写的第一篇博文了吧,嘿嘿,把它也贴过来。一个经典的dfs。
#include<iostream> using namespace std; #define max 26 int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}}; //定义八个方向 因为要按字典树输出 //棋盘应该是按照下面形式分布的(因为这样符合数组的情况) //所以yy[max]是存的字母 那就是“尽量优先往左上跳” (纵坐标尽量小的情况小横坐标尽量小) //则方向数组这样写 int map[max][max],xx[max],yy[max],p,q,step,flag; //路径,X坐标,Y坐标,长,宽,步数,成功标志 void dfs(int i,int j) { //printf("%d %d\n",i,j); int x,y; if(flag) return; xx[step]=i; yy[step]=j; step++;//走的步数 map[i][j]=1; if((step-1)==p*q)//如果遍历的棋盘,则返回 并且成功标记=1 {flag=1;return;} for(int k=0;k<8;k++) { x=i+dir[k][0]; y=j+dir[k][1]; //printf("%d %d"); //system("pause"); //如果不越界 则按条件继续搜索 if(!map[x][y]&&x>=1&&x<=p&&y>=1&&y<=q) { dfs(x,y); step--; } } map[i][j]=0; } int main() { int t,h=0; cin>>t; while(t--) { cin>>p>>q; h++; flag=0; step=1; memset(map,0,sizeof(map)); dfs(1,1); if(flag) { printf("Scenario #%d:\n",h); for(int i=1;i<=p*q;i++) { printf("%c%d",yy[i]+64,xx[i]); //输出每一步跳过的位置 } cout<<endl<<endl; } else { printf("Scenario #%d:\n",h); printf("impossible\n\n"); } } return 0; }
相关文章推荐
- poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】
- poj2488--A Knight's Journey(dfs,骑士问题)
- POJ 2488 A Knight's Journey(DFS——骑士周游问题)
- poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】
- POJ2488 A Knight's Journey(DFS)
- (水)POJ-2488字典序dfs
- DFS poj 2488
- poj 2488 骑士的旅行
- poj 2488 DFS
- POJ 2488 DFS
- poj 2488 A Knight's Journey(dfs)
- POJ 2488 A Knight's Journey (DFS)
- POJ 2488 dfs
- poj2488 A Knight's Journey 简单DFS 注意搜索步骤
- poj 2488(DFS)
- poj 2488 A Knight's Journey(dfs+记录路径)
- poj 2488 dfs
- DFS--poj 2488
- POJ 2488 A Knight's Journey (DFS)
- poj2488旧题重做标准DFS