POJ_2488,dfs西洋棋问题,同马走日(POJ_4123)
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
bool chess[26][26];
int row,col,count,flag;
int nextstep[8][2]={{ -1,-2 },{ 1,-2 },{ -2,-1 },{ 2,-1 },{ -2,1 },{ 2,1 },{ -1,2 },{ 1,2 }};
int result[700][2];
void mydfs(int currow,int curcol){
if(count>=row*col){
flag=1;
return ;
}
else{
for(int i=0;i<8;i++){
int nextrow=currow+nextstep[i][0];
int nextcol=curcol+nextstep[i][1];
if(nextrow<row && nextrow>=0 && nextcol<col && nextcol>=0 && !chess[nextrow][nextcol]){
chess[nextrow][nextcol]=1;
count++;
result[count-1][0]=nextrow;
result[count-1][1]=nextcol;
mydfs(nextrow,nextcol);
if(flag) return ;
count--;
chess[nextrow][nextcol]=0;
}
}
return ;
}
}
int main(){
int test; cin>>test;
for(int testid=1;testid<=test;testid++){
cin>>row>>col;
cout<<"Scenario #"<<testid<<":"<<endl;
if(row==1 && col==1){
cout<<"A1"<<endl<<endl;
continue;
}
if(row<3 || col<3){
cout<<"impossible"<<endl<<endl;
continue;
}
flag=0; count=1;
memset(chess,0,sizeof(chess));
//全部遍历意味着起始点从(0,0)开始字典序最小
chess[0][0]=1; result[0][0]=0; result[0][1]=0;
mydfs(0,0);
if(flag){
for(int i=0;i<row*col;i++){
char c=result[i][1]+'A';
cout<<c<<result[i][0]+1;
}
cout<<endl<<endl;
}
else cout<<"impossible"<<endl<<endl;
}
return 0;
}