N种皇后的两种解法
来源:互联网 发布:网络虚假广告案例 编辑:程序博客网 时间:2024/04/28 20:22
第一种:
循环法
#include<stdio.h>
#define N 9
int count=0;//表示是几种可能
int a[N]={-1};//表示地i行a[i]列是放了皇后的
void printHuhou(){
int i,j;
for(i=0;i<N;i++)
{
printf("\n");
for(j=0;j<N;j++)
{
if(j==a[i])
printf("H ");
else printf("0 ");
}
}
printf("\n");
}
int isOk(int x,int y){//检查是否位置符合标准
int i,j;
for( i=0;i<x;i++)
{j=a[i];
if(j==y||x-y==i-j||x+y==i+j)
return 0;}
return 1;//如何i=0;则直接return 1;
}
void check(int i){
while(i>=0){
a[i]++;
while( a[i]<N&&!isOk(i,a[i]))
a[i]++;//符合条件
if(a[i]<N)//z在N-1列数内就判断
{ if(i==N-1)//最后一行就计数
{count++;
printf("第%d种答案",count);
printHuhou();
}
else
a[++i]=-1;
}
else {
i--;
}
}
}
int main(){
int a,b;
a=time(0);
check(0);
b=time(0);
printf("共有%d种答案",count);
printf("工花了 %d秒",b-a);
return 0;
}
第二种:递归法
#include<stdio.h>
#define N 6//任意改就可以是N皇后了
int count=0;//表示是几种可能
int a[N]={0};//表示地i行a[i]列是放了皇后的
void printHuhou(){
int i,j;
for(i=0;i<N;i++)
{
printf("\n");
for(j=0;j<N;j++)
{
if(j==a[i])
printf("H ");
else printf("0 ");
}
}
printf("\n");
}
int isOk(int x,int y){//检查是否位置符合标准
int i,j;
for( i=0;i<x;i++)
{j=a[i];
if(i==x||j==y)
return 0;
else if(x-y==i-j||x+y==i+j)
return 0;}
return 1;//如何i=0;则直接return 1;
}
void check(int i){
if(i==N)
{puts("布局查看");
printHuhou();
count++;
}//打印出皇后
else{
int l;
for( l=0;l<N;l++){
if(isOk(i,l)){
a[i]=l;
check(i+1);
a[i]=0;//遍历到底了或者失败了就回来进行下一列遍历
}
}
}
return;
}
int main(){
check(0);
printf("共有%d种答案",count);
return 0;
}
- N种皇后的两种解法
- n皇后问题的三种解法
- 八皇后问题的两种解法
- 八皇后问题的两种解法
- 8皇后问题的两种解法
- 八皇后问题的两种解法
- [Wikioi 1295]N皇后问题---两种不同的解法(复习)
- N 皇后的两种做法
- 八皇后问题两种基本解法
- n-Queens(n皇后)问题的两种方法
- N 皇后的递归解法
- n皇后问题的解法
- 八皇后及N皇后的解法
- N皇后问题的回溯解法
- N皇后问题的位移解法
- N皇后问题的c++解法
- N皇后问题的并行解法
- n皇后问题的递归解法
- Process Server Management
- error LNK2001: 无法解析的外部符号 __imp__RegEnumKeyExA@32
- OC语言--Protocol
- Java网络编程
- 第四周编程作业1-素数和
- N种皇后的两种解法
- 使用eclipse CDT 调试cocos2d-x 3.3 android 工程
- C++中引用(&)的用法和应用实例
- 考试排名
- nginx php-fpm安装配置
- 第四周编程作业2-念整数
- c++使用mysql的api连接相关问题
- Effective C++学习笔记(Part Four:Item 18-25)
- Foundation框架常用数据类型和NSAutoreleasePool自动释放池解析