题目描述
设有一个n*n的棋盘(n<=7),在棋盘上的任一点a(x,y)有一个中国象棋的马,按马走日字的规则,试找出一条路径,使马不重复地走遍棋盘上的每一个点.
按这个路径走:
{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-2,1},{-1,-2},{-2,-1}
输入
第一行n,第二行两个数,表示马的起始位置。
输出
n * n 的矩阵 左对齐,每个元素占4位,中间没有空格 没答案要输出-1
样例
输入:
5
1 1
输出:
1 14 19 8 25
6 9 2 13 18
15 20 7 24 3
10 5 22 17 12
21 16 11 4 23
提示
参考代码
#include<bits/stdc++.h>
using namespace std;
int n;
int x,y;
int vis[10][10];
int a[10][10];
int dir[8][2]={{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-2,1},{-1,-2},{-2,-1}};
void dfs(int z,int x,int y){
if(z==n*n){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
printf("%-4d",a[i][j]+1);
}
cout << endl;
}
exit(0);
return ;
}
for(int i=0; i<=7; i++){
if(x+dir[i][0]>=1&&x+dir[i][0]<=n){
if(y+dir[i][1]>=1&&y+dir[i][1]<=n){
if(vis[x+dir[i][0]][y+dir[i][1]]==false){
vis[x+dir[i][0]][y+dir[i][1]]=true;
a[x+dir[i][0]][y+dir[i][1]]=z;
dfs(z+1,x+dir[i][0],y+dir[i][1]);
vis[x+dir[i][0]][y+dir[i][1]]=false;
}
}
}
}
}
int main(){
cin >>n;
cin >>x >>y;
vis[x][y]=true;
dfs(1,x,y);
cout <<"-1" << endl;
return 0;
}