有两周没写过程序了,找了个简单的练练手。
题目:在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;
}