同样的knight问题,但是在OJ上面出的就不一样了。。。哎,好难啊!!我按照以前的方法来写,大的方向和方法都是对的。但是就是那些小细节方面折腾呢。跑出来的结果不对,最后只能看别人对的,然后再改自己的。 不爽。哎,其实题目考的内容很简单,但是非得搞那些说不清的来绊倒你!
#include <iostream>
#include <cstdio>
#include <fstream>
#include <memory.h>
#define MAX 27
using namespace std;
int chess[MAX][MAX],sx[MAX],sy[MAX];
int dx[]={-2,-2,-1,-1,1,1,2,2};
int dy[]={-1,1,-2,2,-2,2,-1,1};
int n,i,j,p,q,sign,step;
void Trace(int x,int y){
if(sign) return; //已经完成遍历,直接返回
int i,ax,ay;
step++;
sx[step]=x;
sy[step]=y;
if(step==p*q){
sign=1;
return ;
}
for(i=0 ;i<8 ;i++){
ax=x+dx[i];
ay=y+dy[i];
if(chess[ax][ay]==0 && ax>0 && ax<=p
&& ay>0 && ay<=q){
chess[ax][ay]=1;
Trace(ax,ay);
step--;
chess[ax][ay]=0;
}
}
}
int main()
{
int t=0;
freopen("acm.txt","r",stdin);
scanf("%d",&n);
while(n--){
t++;
step=0;
sign=0;
scanf("%d%d",&p,&q);
memset(chess,0,sizeof(chess));
chess[1][1]=1;
Trace(1,1);
printf("Scenario #%d:\n",t);
if(sign){
for(i=1 ;i<=p*q ;i++)
{
printf("%c%d",sy[i]+64,sx[i]);
}
printf("\n");
}
else{
printf("impossible\n");
}
if(n) printf("\n");
}
return 0;
}