题目:http://poj.org/problem?id=2488
# include<stdio.h>
# include<string.h>
int vist[27][27],saveCol[27],saveRow[27],j,succeed,count,area;
int temp[8][2] = { {-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1} } ,p,q; //字典序
int dfs(int hang,int lie,int step)
{
int i,a,b;
if(succeed == 1) return 1; //剪枝,没有也不超时,但我喜欢这种剪枝
if(step == area )
{
succeed =1 ;return 1;
}
for(i=0;i<8;i++)
{
a=hang+temp[i][1]; //因为有多解,又是OJ测数据,所以按字典序
b=lie+temp[i][0];
if(!vist[a][b] && a>=1 && a<=p && b>=1 && b<=q)
{
saveCol[j]=a;
saveRow[j]=b;
vist[hang][lie]=1;
j++;
if( dfs(a,b,step+1) ) return 1;
j--;
vist[hang][lie]=0;
}
}
return 0;
}
int main()
{
int n,k;
scanf("%d",&n);
while(n--)
{
succeed=0;
memset(vist,0,sizeof(vist));
memset(saveRow,0,sizeof(saveRow));
memset(saveCol,0,sizeof(saveCol));
scanf("%d%d",&p,&q);
count++;
area = p * q ;
saveCol[0] = saveRow[0] = j = 1;
printf("Scenario #%d:\n",count);
if( dfs(1,1,1) )
{
for(k=0;saveCol[k]!=0;k++)
{
succeed=1;
printf("%c%d",saveRow[k]+'A'-1,saveCol[k]);
}
printf("\n\n");
}
else
puts("impossible\n");
}
return 0;
}