#include
#include
#include
int m,n;//棋盘大小
int c[100][100];
int dy[]={2,1,-1,-2,-2,-1,1,2};
int dx[]={1,2,2,1,-1,-2,-2,-1};
int judge(int x,int y)//判断是否在棋盘上
{
if(x>0&&x<=m&&y>0&&y<=n)
return 1;
else
return 0;
}
void print()
{
int i,j;
static int count=0;
printf("case:%d",++count);
printf("\n");
c[1][1]=1;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
printf("%d\t",c[i][j]);
}
printf("\n");
}
printf("\n\n");
}
void dfs(int x,int y,int step)
{
bool flag = true;
int j, xx, yy;
for(j=0;j<8;j++)
{
xx=x+dx[j];//如果这里不使用xx和yy,而直接使用x和y, 则在下一次循环中,起点不一样;
yy=y+dy[j];//每次循环都需要保证这次起点和上次的起点一致
if(judge(xx,yy)==1){//只有在棋盘上的情况下才需要进一步深搜
if (c[xx][yy]){
continue;
}
c[xx][yy]=step;
// if(step==m*n)
// {
// print();
// }
// else
// {
flag = false;
dfs(xx,yy,step+1);
c[xx][yy]=0;
// }
}
}
if (flag){//如果flag是true,则说明在(x, y)处不能往其他地方走(前提是不能走到重复的位置)
//如果flag是false,则说明在(x, y)处还能走到其他地方
print();
}
}
int main()
{
memset(c, 0, sizeof(c));//先清空棋盘
scanf("%d%d",&m,&n);
dfs(1,1,1);
return 0;
}