#include
int cnt=0,c=0;
int move[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; //用于存储走的八个位置
int H[12][12]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,0,0,0,0,0,0,0,0,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
};;
void print() //输出排好的棋盘
{
int i,j;
printf("这是第%d组解\n",++c);
for(i=2;i<10;i++)
{
for(j=2;j<10;j++)
{
printf("%3d",H[i][j]);
}printf("\n");
}
printf("\n");
}
void House(int x,int y){
int i,a,b;
for(i=0;i<8;i++) //每一次马都有八个位置可以走
{
a=move[i][0]+x; //试探
b=move[i][1]+y;
if(H[a][b]==0) //若试探的位置未走过,则走入该位置
{
H[a][b]=++cnt;
if(cnt==64) //若当前位置为棋盘最后一个空位,则执行输出函数
{
print();
}
else // 当前位置不为棋盘最后一个空位,则递归调用House函数
House(a,b);
H[a][b]=0; //回溯时将当前位置走过的痕迹抹去
cnt--;
}
}
}
int main(void)
{
int i,j;
for(i=2;i<10;i++){ //将棋盘的每个位置都作为初始位置调用House函数
for(j=2;j<10;j++)
{
cnt=0;
H[i][j]=++cnt;
House(i,j);
}
}
return 0;
}
一键复制
编辑
Web IDE
原始数据
按行查看
历史