您的位置:首页 > 其它

pku2488 dfs

2010-07-23 00:11 218 查看
http://162.105.81.212/JudgeOnline/problem?id=2488

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

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



就是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: