回溯法解决N皇后问题

有两周没写过程序了,找了个简单的练练手。

题目:在N*N的格子上放N个皇后,任意两个皇后不能处于同一横排,同一纵排,也不允许处在同一与棋盘边框成45度角的斜线上。

分析:用N位数表示N皇后问题的解(放进数组g[N]中),第k个数为j,表示第k行第j列放一个皇后。不允许处于同一行或者同一列,则N位数中1--N各出现一次,不能重复。不能处于45度斜线上,则 | g[j] - g[k] | !=j - k 。

国际惯例,代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int i,g,k,j,n,x,a[20];
	cout<<"输入皇后个数:";
	cin>>n;
	cout<<n<<"皇后问题的解为:"<<endl;
	i=1;
	int sum=0;
	a[1]=1;
	while (1)
	{
		g=1;//满足条件的解的标志
		for (k=i-1;k>=1;k--)
		{
			x=a[i]-a[k];
			if (x<0)
			{
				x=-x;
			}
			if (x==0||x==i-k)//相列或者处于同一对角线时返回
			{
				g=0;
			}
		}

		if (i==n&&g==1)//满足条件是输出
		{
			for (j=1;j<=n;j++)
			{
				cout<<a[j];
			}
			cout<<"    ";
			sum++;//统计满足条件的解的个数
			if (sum%5==0)//输出5个一行
			{
				cout<<endl;
			}
		}

		if (i<n&&g==1)//还没到n个数,则下一个a[i]从1开始赋值继续
		{
			i++;
			a[i]=1;
			continue;
		}
		while(a[i]==n&&i>1)//往前回溯
		{
			i--;
		}
		if (a[i]==n&&i==1)//回溯试探结束
		{
			break;
		} 
		else//下一列
		{
			a[i]=a[i]+1;
		}
	}
	cout<<"\n共有"<<sum<<"个解。"<<endl;
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值