骑士巡游问题
时间限制:1秒 内存限制:128M
题目描述
输入 n ( 1< = n < = 6 ) 代表棋盘的规模就是 n*n 的规模,骑士永远从 (1,1) 出发,要求骑士走遍所有棋盘的格子,输出这个骑士的走法(遍历棋盘的所有格子)。
注意方向:
const int dx[8]={-2,-2,-1,1,2,2,1,-1};
const int dy[8]={-1,1,2,2,1,-1,-2,-2};
输入描述
输入一行,一个正整数n。
输出描述
若能得到巡游的结果,则输出n行,每行n个数字,表示骑士走遍所有格子的顺序;若得不到,则输出"No result"。
样例
输入
5输出
1 10 5 18 3 14 19 2 11 6 9 22 13 4 17 20 15 24 7 12 23 8 21 16 25
#include<iostream>
#include<cstdio>
using namespace std;
const int N=10;
const int dx[8]={-2,-2,-1,1,2,2,1,-1};
const int dy[8]={-1,1,2,2,1,-1,-2,-2};
int n,cnt[N][N];
bool vis[N][N],flag=false;
bool ran_out(int x,int y){
return x<1||x>n||y<1||y>n;
}
void out(){
flag=true;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",cnt[i][j]);
}
printf("\n");
}
return;
}
void dfs(int x,int y,int step){
if(flag) return;
cnt[x][y]=step;
vis[x][y]=true;
if(step==n*n){
out();
return;
}
for(int i=0;i<8;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(!ran_out(xx,yy)&&!vis[xx][yy]&&!flag){
dfs(xx,yy,step+1);
}
}
vis[x][y]=false;
}
int main(){
scanf("%d",&n);
dfs(1,1,1);
if(!flag) printf("No result");
return 0;
}
手机号码
时间限制:1秒 内存限制:128M
题目描述
人们