八皇后问题求解1
2010-08-12 16:03
288 查看
#include <iostream.h>
using namespace std;
int col[8],Left[15],Right[15];
int queen[8];
int n=0;
int sum=0;
void generate()
{
int h,i;
for(h=0;h<=7;h++)
{
if(col[h]&& Left[n+h] && Right[n-h+7])
{
queen
=h;
col[h]=false;
Left[n+h]=false;
Right[n-h+7]=false;
n+=1;
if(n==8)
{
sum++;
cout<<" "<<sum;
for(i=0;i<=7;i++)
cout<<"/t"<<queen[i];
cout<<endl;
}
else generate();
n--;
Left[n+h]=true;
Right[n-h+7]=true;
col[h]=true;
}
}
}
int main()
{
int c,s;
for(c=0;c<=7;++c)
col[c]=true;
for(s=0;s<=14;++s)
{
Left[s]=true;
Right[s]=true;
}
cout<<" 行数/t0/t1/t2/t3/t4/t5/t6/t7"<<endl;
generate();
cout<<"八皇后摆法总数:"<<sum<<endl;
return 0;
}
Left[]用来判断左对角线能否放皇后
Right[]....
h列号
n为行号
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int n=8;
int x[8]={0};
int sum=0;
int place(int k)
{
int j;
for(j=0;j<k;j++)
if((fabs(k-j)==fabs(x[j]-x[k]))||(x[j]==x[k])) return 0;
return 1;
}
void backtrace(int t)
{
int i;
if(t>=n)
{
putchar('/n');
for(i=0;i<n;i++)
printf("%d/t",x[i]);
sum++;
if(!(sum%25)) getchar();
}
else
for(i=0;i<n;i++)
{
x[t]=i;
if(place(t)) backtrace(t+1);
}
}
void main()
{
backtrace(0);
printf("%d/n",sum);
getchar();
}
using namespace std;
int col[8],Left[15],Right[15];
int queen[8];
int n=0;
int sum=0;
void generate()
{
int h,i;
for(h=0;h<=7;h++)
{
if(col[h]&& Left[n+h] && Right[n-h+7])
{
queen
=h;
col[h]=false;
Left[n+h]=false;
Right[n-h+7]=false;
n+=1;
if(n==8)
{
sum++;
cout<<" "<<sum;
for(i=0;i<=7;i++)
cout<<"/t"<<queen[i];
cout<<endl;
}
else generate();
n--;
Left[n+h]=true;
Right[n-h+7]=true;
col[h]=true;
}
}
}
int main()
{
int c,s;
for(c=0;c<=7;++c)
col[c]=true;
for(s=0;s<=14;++s)
{
Left[s]=true;
Right[s]=true;
}
cout<<" 行数/t0/t1/t2/t3/t4/t5/t6/t7"<<endl;
generate();
cout<<"八皇后摆法总数:"<<sum<<endl;
return 0;
}
Left[]用来判断左对角线能否放皇后
Right[]....
h列号
n为行号
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int n=8;
int x[8]={0};
int sum=0;
int place(int k)
{
int j;
for(j=0;j<k;j++)
if((fabs(k-j)==fabs(x[j]-x[k]))||(x[j]==x[k])) return 0;
return 1;
}
void backtrace(int t)
{
int i;
if(t>=n)
{
putchar('/n');
for(i=0;i<n;i++)
printf("%d/t",x[i]);
sum++;
if(!(sum%25)) getchar();
}
else
for(i=0;i<n;i++)
{
x[t]=i;
if(place(t)) backtrace(t+1);
}
}
void main()
{
backtrace(0);
printf("%d/n",sum);
getchar();
}
相关文章推荐
- 回溯法求解 “n 皇后 问题”——Java 实现
- 回溯算法基础---皇后问题,骑士游历,迷宫求解
- 回溯法求解n皇后问题
- 递归求解N皇后问题
- 八皇后问题 递归求解法
- javascript求解N皇后问题封装
- 回溯法求解N皇后问题(Java实现)
- 求解高斯8皇后问题
- N皇后问题的求解过程
- 用回溯法求解N皇后和迷宫问题
- 递归与迭代法求解N皇后问题
- N皇后问题——递归求解
- 深度优先—递归方法 求解n皇后问题
- N 皇后问题 —— 递归求解
- N皇后问题利用回溯法求解
- 回溯法解决N皇后问题——递归与非递归求解
- 使用C#求解N皇后问题。
- 数据结构与算法中的“递归”——用回溯法求解8皇后问题
- 8皇后问题递归求解
- 回溯法求解n皇后问题