问题描述:8*8的棋盘,刚开始让马在棋盘的任意一个位置上,让马踏日,(有八个方向),判断没踏过并且可踏,就踏,直到踏完所有的格子(cnt==64),调用printchess函数。
在外层另外加上两层,确保 8*8 方格中的每一个格子都有8中不同的选择;
重点:为了确保每个格子能走日字,而且选择的可能性等同,初始化除了最外两层格子标记没有被访问,最外两层中每个格子都标记为已被访问即可达到目标!
#include <iostream>
#include <cstdio>
using namespace std;
int chess[12][12]={0};
int count=0, sum=0;
int next[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},\
{-1,-2},{1,-2},{2,-1}};
void printchess();
void dfs(int x, int y);
int main()
{
for (int i=0; i<12; i++)
for (int j=0; j<12; j++)
if (i==0||i==1||i==10||i==11||j==0||j==1||j==10||j==11)
chess[i][j]=-1;//把外面两层设为可走但已经走过
chess[2][2]=++count;//相当于[0][0]标记
dfs(2, 2);
return 0;
}
void dfs(int x, int y)
{
if (count>=64){
sum++;
printchess();
return;
}
for (int i=0; i<8; i++){
int tx=x+next[i][0];
int ty=y+next[i][1];
if (chess[tx][ty]==0){
count++;
chess[tx][ty]=count;//count是每个格子第几步走到
dfs(tx, ty);
count--;
chess[tx][ty]=0;
}
}
}
void printchess()
{
for (int i=2; i<=9; i++){
for (int j=2; j<=9; j++){
printf("%4d", chess[i][j]);
}
}
printf("\n\n");
}