当先锋百科网

首页 1 2 3 4 5 6 7

问题描述: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");
}