#include <iostream>
using namespace std;
struct Step //记录每一步的坐标
{
int x;
int y;
};
bool over=false; //是否遍历的标记值
int col=0; //棋盘的大小
int row=0;
int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
int chessBoard[50][50];
int Count=0;
Step step[100];
void print(int);
void travel(int,int);
void print(int n)
{
cout << "Scenario #" << n << ":" << endl;
if(over)
{
int i=0;
while(i<col*row)
{
cout << char(step[i].x+64) << step[i].y;
i++;
}
cout << endl;//提交的时候注意这里有两个回车
cout << endl;
}
else
{
cout << "impossible" << endl << endl;
}
}
void travel(int y,int x)
{
if(Count==(col*row))
{
over=true;
}
if(!over)
{
for(int i=0;i < 8 && !over;i++)
{
if((x+dir[i][0] <= col)&&((x+dir[i][0]) >= 1)&&((y+dir[i][1]) >= 1)&&((y+dir[i][1]) <= row)&&(!chessBoard[y+dir[i][1]][x+dir[i][0]]))
{
chessBoard[y+dir[i][1]][x+dir[i][0]]=true;
step[Count].x=x+dir[i][0];
step[Count].y=y+dir[i][1];
Count++;
travel(y+dir[i][1],x+dir[i][0]);
Count--;
//step[Count].x=0;
//step[Count].y=0;
chessBoard[y+dir[i][1]][x+dir[i][0]]=false;
}
}
}
}
int main()
{
int n;
int k=1;
int i, j;
cin >> n;
while(k<=n)
{
over=false;
Count=0;
for(i=0;i<50;i++)
{
for(j=0;j < 50;j++)
chessBoard[i][j]=false;
}
for(i = 0;i < 100;i++)
{
step[i].x=0;
step[i].y=0;
}
cin >> row >> col;
step[Count].x=1;
step[Count].y=1;
chessBoard[1][1]=true;
Count++;
travel(1,1);
print(k++);
}
return 0;
}
本文介绍了一个解决骑士周游问题的C++程序实现。通过递归搜索算法,该程序能够在给定的棋盘大小内寻找骑士遍历所有格子的路径。若找到解决方案,则输出每一步的位置;若无解,则输出'impossible'。
771

被折叠的 条评论
为什么被折叠?



