http://poj.org/problem?id=2488
题目大意:是说给你一个棋盘,看看其实是否可以在每个点只经过一次的情况下遍历整个棋盘。
思路:其实就是搜索题目,但是方向很重要,而且题目输出时要求y轴用abcd表示,所以这里要注意。
还有就是学会了记录路径。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int a[30][30],v[30][30];
int pre[100][2];
int p,q,flag;
int d[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
void dfs(int x,int y,int step)
{
int i,j;
if(step==(p*q)&&!flag)
{
for(i=1;i<=step;i++)
{
printf("%c%d",pre[i][1]+'A'-1,pre[i][0]);
}
printf("\n");
flag=1;
return;
}
else
{
int xx,yy;
for(i=0;i<8;i++)
{
if(flag==0)
{
xx=x+d[i][0];
yy=y+d[i][1];
if(xx>=1&&xx<=p&&yy>=1&&yy<=q&&v[xx][yy]==0)
{
// printf("x=%d %d %d\n",xx,yy,step);
v[xx][yy]=1;
pre[step+1][0]=xx;
pre[step+1][1]=yy;
dfs(xx,yy,step+1);
v[xx][yy]=0;
}
}
else
return;
}
}
}
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(k=1;k<=n;k++)
{
scanf("%d%d",&p,&q);
flag=0;
printf("Scenario #%d:\n",k);
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
v[1][1]=1;
pre[1][0]=1;
pre[1][1]=1;
dfs(1,1,1);
if(!flag)
printf("impossible\n");
if(k!=n)
printf("\n");
}
}