The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?
Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.
Input
If no such path exist, you should output impossible on a single line.
3 1 1 2 3 4 3Sample Output
Scenario #1: A1 Scenario #2: impossible Scenario #3: A1B3C1A2B4C2A3B1C3A4B2C4代碼:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int maxn=10010;
int v[35][35],v1[35][35];
char vis[905][2];
int f[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int l=1,n,l1,l2,flag,t=1;
int Judge(int x1,int y1)
{
if(x1<0||x1>=l1||y1<0||y1>=l2)return 0;
if(v[x1][y1]>0)return 0;
return 1;
}
void dfs(int x,int y)
{
vis[l][0]=x+'1';
vis[l][1]=y+'A';
if(l==l1*l2){
flag=1;
for(int i=1;i<=l1*l2;i++){
printf("%c%c",vis[i][1],vis[i][0]);
}
printf("\n");
return;
}
for(int k=0;k<8&&(flag==0);k++){
int x1,y1;
x1=x+f[k][0];
y1=y+f[k][1];
if(Judge(x1,y1)){
v[x1][y1]=1;
l++;
dfs(x1,y1);
l--;
v[x1][y1]=0;
}
}
return;
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%d %d",&l1,&l2);
printf("Scenario #%d:\n",t++);
l=1; flag=0;
v[0][0]=1;
dfs(0,0);
memset(v,0,sizeof(v));
memset(v1,0,sizeof(v1));
memset(vis,0,sizeof(vis));
if(!flag) printf("impossible\n");
if(n) printf("\n");
}
return 0;
}
在搜索是直接從(0,0)開始就行,在某一點存在不能搜索的點,在任何地方都會有不能搜索到的點。橫縱座標。。。。。。怎麼分辨
字典序要求搜索時
f[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
一定是向座標最小的地方走