POJ 2488 A Knight's Journey

来源:互联网 发布:怎么阅读安卓源码 编辑:程序博客网 时间:2024/06/16 09:56

链接:http://poj.org/problem?id=2488

题目大意:类似国际象棋里的棋盘,但是长宽不一定相等,问骑士能不能在任意一个点走完整个棋盘。

思路:深搜。题目要求输出字典序最小的。那么优先顺序是关键。

 大概就是这么个方向吧:左下方,左上方,左下方,左上方,右下方,右上方,右下方,右上方。
然后找到第一条路径之后就输出就行了。
#include<cstdio>#include<cstring>#include<iostream>using namespace std;int dx[]={-1,1,-2,2, -2,2,-1,1};  //方向数组  这是顺序优先int dy[]={-2,-2,-1,-1,1,1,2,2}; int v[50][50];int n,m;struct p{int x;int y;}path[10000];//路径bool ok(int curx,int cury)//边界判断{if(curx<n && curx>=0 && cury<m && cury>=0)return 1;return 0;}bool dfs(int curx,int cury,int count){int i;if(count==n*m){for(int i=0;i<m*n;i++)printf("%c%d",path[i].y+'A',path[i].x+1);printf("\n");return 1;}else {for(i=0;i<8;i++){if(ok(curx+dx[i],cury+dy[i]) && ! v[curx+dx[i]][cury+dy[i]]){path[count].x=curx+dx[i];path[count].y=cury+dy[i];v[curx+dx[i]][cury+dy[i]]=1;if(dfs(curx+dx[i],cury+dy[i],count+1))return 1;v[curx+dx[i]][cury+dy[i]]=0;}}}return 0;}int main(){int T;scanf("%d",&T);for(int j=1;j<=T;j++){memset(v,0,sizeof(v));scanf("%d %d",&n,&m);v[0][0]=1;path[0].x=path[0].y=0;printf("Scenario #%d:\n",j);if(!dfs(0,0,1))printf("impossible\n");printf("\n");}return 0;}

原创粉丝点击