POJ 2488 A Knight's Journey
2012-08-03 10:15
176 查看
题意:给一个p*q的棋盘,问你能不能遍历整个棋盘的每一个方格,如果能输出路径,不能则impossible. 简单的深度遍历,得看看0msAC的有什么不同,这个是32ms,在输出时注意先输出列再输出行,例用大写字母表示结果按字典序排序,所有在遍历的时候先要从列小的开始。
代码:
代码:
#include<iostream> using namespace std; int d[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}}; bool visit[30][30],success; int n,m,k,path[30][2]; bool Judge(int i,int j) { if(i>=0&&j>=0&&i<n&&j<m) return true; return false; } bool Mark() { for(int i=0; i<n; i++) for(int j=0; j<m; j++) if( !visit[i][j]) return false; return true; } void Search(int x,int y) { int i,px,py,flag; visit[x][y]=true; // printf("%d %d\n",x,y); for( i=0,flag=0; i<8&&!success; i++){ px=x+d[i][0]; py=y+d[i][1]; if( Judge(px,py)&&!visit[px][py]){ flag=1; Search(px,py); } } if( !flag&&Mark()){ // printf("%d %d\n",x,y); success=true; } if( !success) visit[x][y]=false; else{ path[k][0]=x; path[k][1]=y; k++; } } int main() { int t,i,j; scanf("%d",&t); for(int ca=1; ca<=t; ca++){ success=false; scanf("%d%d",&n,&m); printf("Scenario #%d:\n",ca); memset(path,0,sizeof(path)); memset(visit,false,sizeof(visit)); k=0; if( n==1&&m!=1||m==1&&n!=1) printf("impossible"); else{ for( i=0; i<m&&!success; i++){ for( j=0; j<n; j++){ Search(j,i); if( success) break; } } if( !success) printf("impossible"); else{ for( i=k-1; i>=0; i--) printf("%c%d",'A'+path[i][1],path[i][0]+1); } } printf("\n\n"); } }
相关文章推荐
- poj 2488 A Knight's Journey
- POJ 2488-A Knight's Journey(DFS-象棋中的马)
- 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
- Poj(2488),按照字典序深搜
- A Knight's Journey POJ 2488
- POJ-2488 A Knight's Journey 解题报告
- poj 2488 A Knight's Journey
- POJ 2488 A Knight's Journey (DFS)
- POJ 2488 A Knight's Journey
- poj2488——A Knight's Journey
- POJ 2488 A Knight's Journey
- POJ2488 A Knight's Journey
- poj 2488 排序交换数
- poj2488
- POJ 2488 A Knight's Journey【dfs过】
- POJ2488 A Knight's Journey(DFS)
- poj 2488 dfs