您的位置:首页 > 编程语言 > C语言/C++

poj 2488:A Knight's Journey

2014-07-07 19:09 447 查看
解题思路:

DFS + 路径保存

#include<iostream>
#include<cstring>
using namespace std;

int m,r,c;
int map[30][30];	//记录方格是否被覆盖
int x[100],y[100];	//记录路径
int num;	//已经覆盖的方格数
bool flag;	//是否已经找到可行解

void DFS(int i,int j)
{
if(flag)
return;
//找到结果
if(num == r*c)
{
for(int i=0;i<num;i++)
cout<<char(x[i]+'A'-2)<<y[i]-1;
cout<<endl<<endl;
flag = true;
return;
}
//骑士可运动的八个方向,注意次序
if(map[i-2][j-1] == 1)
{
map[i-2][j-1] = 0;
x[num] = i-2;
y[num] = j-1;
num ++;
DFS(i-2,j-1);
map[i-2][j-1] = 1;
num--;
}
if(map[i-2][j+1] == 1)
{
map[i-2][j+1] = 0;
x[num] = i-2;
y[num] = j+1;
num ++;
DFS(i-2,j+1);
map[i-2][j+1] = 1;
num--;
}
if(map[i-1][j-2] == 1)
{
map[i-1][j-2] = 0;
x[num] = i-1;
y[num] = j-2;
num ++;
DFS(i-1,j-2);
map[i-1][j-2] = 1;
num--;
}
if(map[i-1][j+2] == 1)
{
map[i-1][j+2] = 0;
x[num] = i-1;
y[num] = j+2;
num ++;
DFS(i-1,j+2);
map[i-1][j+2] = 1;
num--;
}
if(map[i+1][j-2] == 1)
{
map[i+1][j-2] = 0;
x[num] = i+1;
y[num] = j-2;
num ++;
DFS(i+1,j-2);
map[i+1][j-2] = 1;
num--;
}
if(map[i+1][j+2] == 1)
{
map[i+1][j+2] = 0;
x[num] = i+1;
y[num] = j+2;
num ++;
DFS(i+1,j+2);
map[i+1][j+2] = 1;
num--;
}
if(map[i+2][j-1] == 1)
{
map[i+2][j-1] = 0;
x[num] = i+2;
y[num] = j-1;
num ++;
DFS(i+2,j-1);
map[i+2][j-1] = 1;
num--;
}
if(map[i+2][j+1] == 1)
{
map[i+2][j+1] = 0;
x[num] = i+2;
y[num] = j+1;
num ++;
DFS(i+2,j+1);
map[i+2][j+1] = 1;
num--;
}
return;
}

int main()
{
cin>>m;
for(int k=1;k<=m;k++)
{
memset(map,0,sizeof(map));
cin>>r>>c;
for(int i=2;i<=c+1;i++)
for(int j=2;j<=r+1;j++)
map[i][j] = 1;
cout<<"Scenario #"<<k<<":"<<endl;
flag = false;
num = 0;
map[2][2] = 0;
x[0] = 2;
y[0] = 2;
num ++;
DFS(2,2);
if(flag == false)
cout<<"impossible"<<endl<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ poj dfs