http://acm.pku.edu.cn/JudgeOnline/problem?id=2488
题意:给定p,q 求由任意位置开始访问,以何种路径能够访问完这个p*q的矩阵。
深度优先搜索。
#include <cstdio>
#include <iostream>
using namespace std;
typedef struct
{
char x;
char y;
}Step;//路径节点结构体
int point[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};//所走路的步伐
bool flag[50][50];//标记位
int p,q;
Step step[100];//存放路径节点
int number;
int count;
bool dfs(int x,int y)
{
int i;
int px,py;
if(count == p*q)return true;
for(i = 0;i < 8;i ++)
{
px = x+point[i][0];
py = y+point[i][1];//所走步伐
if(px >= 1 && px <= q && py >= 1 && py <= p && flag[px][py] == false)//判断是否走出界以及该节点是否走过
{
count ++;//节点自加1
flag[px][py] = true;//标记为真
if(dfs(px,py))//判断该节点是否有下一个节点可走
{
step[number].y = py+'0';
step[number].x = px+64;//该节点的位置
number ++;
return true;
}
flag[px][py] = false;//若没有下一个节点可走标记赋值为false
count --;//节点自减,减掉该节点
}
}
return false;
}
int main()
{
int i;
int test,cas = 0;
scanf("%d",&test);
while(test --)
{
memset(flag,false,sizeof(flag));//标记初始化
flag[1][1] = true;//第一个节点标记为真
count = 1;//节点初始化为1
number = 0;
scanf("%d%d",&p,&q);//输入长和宽
printf("Scenario #%d:/n",++ cas);
if(dfs(1,1))//由第一个节点开始深度优先遍历
{
step[number].y = '1';
step[number].x = 'A';
number ++;
for(i = number - 1;i >= 0;i --)
printf("%c%c",step[i].x,step[i].y);
printf("/n");
}
else
printf("impossible/n");
printf("/n");
}
return 0 ;
}
/*
3
1 1
2 3
4 3
Scenario #1:
A1
Scenario #2:
impossible
Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
*/