pku2488 dfs

http://162.105.81.212/JudgeOnline/problem?id=2488

题意:国际象棋的马从(1,1)开始遍历棋盘,问是否能够走完所有的位置,要是能就输出路线,不能就输出impossible。

分析:主要注意的是字典顺序的马步;

pku2488 dfs_第1张图片

就是dir[8][2] = {-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2};的位置不能改变,改变就是wa的。

简单的dfs吧;但是还就没写了,生疏啦~

#include<iostream> using namespace std; int visit[100][100], stepx[100], stepy[100]; int dir[8][2] = {1,-2,-1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2}; //字典顺序,顺序不对就会WA; int p, q, k, flag; void dfs(int x, int y, int s) { int tx, ty, i; if(flag) //因为可能会有多种路线,控制输出一种即可; { if(visit[x][y] == 1) //可走 { visit[x][y] = 0; stepx[s] = x; stepy[s] = y; if(s == p * q) //输出路线 { printf("Scenario #%d:/n", k); for(i=1; i<=s; i++) printf("%c%d",stepy[i]-1+'A', stepx[i]); printf("/n/n"); flag = 0; /////// } else { for(i=0; i<8; i++) { tx = x + dir[i][0]; ty = y + dir[i][1]; if(tx>=1 && tx<=p && ty>=1 && ty<=q && visit[tx][ty]) dfs(tx, ty, s+1); } } visit[x][y] = 1; //////////注意,回溯; } } } int main() { int i, t, j; scanf("%d",&t); for(k=1; k<=t; k++) { memset(visit, 0, sizeof(visit)); memset(stepx, 0, sizeof(stepx)); memset(stepy, 0, sizeof(stepy)); scanf("%d%d",&p, &q); for(i=1; i<=p; i++) for(j=1; j<=q; j++) visit[i][j] = 1; //棋盘初始化为1; flag = 1; dfs(1, 1, 1); if(flag) //不成立 printf("Scenario #%d:/nimpossible/n/n",k); } return 0; } 

你可能感兴趣的:(c)