数据结构-八皇后算法

八皇后的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。

参考网上资料改写

  代码如下:

#include<iostream>
#include<queue>
#include<math.h>
#include<fstream>
using namespace std;

#define N 8           // 棋盘的格数
int chess[N][N] = {0}; // 棋盘
int numofway = 0; // 有多少种放法
int iscanput(int row, int col) // 确定某一格能不能放
{
	int i,j;
	for(i = 0; i < N; i ++)
	{
		if(chess[i][col] == 1) //有 同列的
		{
			return 0;
		}
		for(j = 0; j < N; j++)
		{
			if(chess[row][j]==1) //有同行的
			{
				return 0;
			}
			if(((i-row)==(j-col)||(i-row)==(col-j))&&chess[i][j]==1) // 对角线上有的
			{
				return 0;
			}
		}
	}
	return 1;
}
void print_chess()
{
	for (int i=0;i<N;i++)
	{
		for (int j=0;j<N;j++)
		{
			printf("%d",chess[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
int put_chess(int row)
{
	int i,result;
	for (i=0;i<N;i++)
	{
		if (iscanput(row,i))//如果此处能放
		{
			chess[row][i]=1;//该格置为1,表明已放下
			if (row==N-1)//最后一行
			{
				numofway++;
				print_chess();
				chess[row][i]=0;//放完N个皇后后重置
				continue;
			}
			result=put_chess(row+1);//搜索下一行
			if (result==0)//下一行不能放
			{
				chess[row][i]=0;
				continue;
			}
			else
			{
				break;
			}
		}
	}
	if (i==N)//如果这一行的每一空格都不能放
	{
		return 0;
	}else
	{
		return 1;
	}
}
int main()
{
	int result ;
	result = put_chess(0); // 放置
	printf("the number of put way is %d\n", numofway); //打印信息
	return 0;
}
    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/siliang13/article/details/24187719
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞