如题:http://poj.org/problem?id=2488
马踏棋盘问题,深搜,注意题目中的横纵坐标是反的,输出的是按字典序的第一种路径,就要求对马先后走哪一步进行限制
#include<iostream>
using namespace std;
#define MAXN 27
int map[MAXN][MAXN];
int cx[MAXN];
int cy[MAXN];
int sign;
int step;
int p,q;
int oper[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; //这里是马该跳的顺序(x,y)深搜时要反过来
void Dfs(int i,int j) //棋子坐标(i,j)看是否能走完全部的棋盘
{
int x,y;
if(sign)
return;
step++;
cx[step]=i;
cy[step]=j;
if(step==p*q)
{
sign=1;
return;
}
map[i][j]=1;
for(int m=0;m<8;m++)
{
x=i+oper[m][1];
y=j+oper[m][0];
if(map[x][y]==0&&x>0&&y>0&&x<=p&&y<=q)
{
Dfs(x,y);
step--;
}
}
map[i][j]=0; //从这个点跳过去的所有可能的8个点都失败了,回溯,这个点设置未访问
}
int main()
{
int N;
cin>>N;
for(int j=1;j<=N;j++)
{
step=0;
sign=0;
scanf("%d %d",&p,&q);
getchar();
memset(map,0,sizeof(map));
printf("Scenario #%d:\n", j);
Dfs(1,1);
if(sign)
{
for (int i = 1; i <= p * q; i++)
{
printf("%c%d", cy[i]+'A'-1, cx[i]);
}
printf("\n");
}
else
{
printf("impossible\n");
}
printf("\n");
}
return 0;
}