惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
GbyAI
GbyAI
P
Proofpoint News Feed
B
Blog
MyScale Blog
MyScale Blog
V
V2EX
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
量子位
Jina AI
Jina AI
博客园 - 叶小钗
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
罗磊的独立博客
L
LangChain Blog
I
InfoQ
云风的 BLOG
云风的 BLOG
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
小众软件
小众软件
V
Visual Studio Blog
月光博客
月光博客
The Cloudflare Blog
雷峰网
雷峰网

博客园 - 暴风雨

新开发的网站,小熊礼品网 w3c 检查 怎样利用网络来扩大幼儿园的影响力? 幼教网址大全 免费幼儿园网站 打靶问题 使用Google Search API 怎样在Exe间传递参数 .Net开发中的设计问题和构架 构建模式—单例模式 用IComparable来实现可排序的集合 用C#实现MVC(Model View Control)模式介绍 C++写的一个读取CSV文件的函数 尝试概要设计的写法 今天游泳很高兴 每天进步一点点 自己写的一个VB.netDB操作类 .NET Framework 自动内存管理机制深入剖析 (C#分析篇)[转] 深秋夜自嘲
以前的作业:八皇后问题求解
暴风雨 · 2005-12-23 · via 博客园 - 暴风雨

在电脑上突然发现了以前的作业,在这里保存一下。
是C++程序。

////////////////////////////////////////////////////////////////////////////////////////////////////
//作业:5-4,  八皇后问题求解。                                                                                             
//说明: 问题抽象成输出8个数字(0-----7) 分别表示第i  行上皇后的位置,  
//             例:  输出7  1  3  0  6  4  2  5  表示这个合法布局是在第一行第8   个位    
//             置放置第一个皇后,第二行第2  个位置放置第二个皇后.   
//             最后输出的5  表示在第八行第6  个位置放置第八个皇后。             
//注意: 本题记数方式是从0 到7  ,即在本题中0  表示第一行,1  表示第  
//             二行,i   表示第i-1  行。                                                                                        
//问题抽象: 此问题被我抽象输出0---7 八个数字,满足以下条件:                
//                      一,不重复输出,即已经输出过的数字,不能再输出。      
//                      二,当要输出第n  个数字时,(此时已经有位置的前n-1  个数
//                                 字被保存到数组a[] 中),假设这个数字是i  则应满足:      
//                                (a[k]-(n-k))==i&&(a[k]+(n-k))==i  (k是数组中已经存放的第几个数)   
//                                这是对题中要求的任意两个不在同一对角线上的抽象  
//                      这两个条件的满足是在Find()  函数实现的。                                      
//时间:2002年11月29日。                                                                                                          
//作者:   暴风雨                                          
//欢迎交流                                                                                                    
////////////////////////////////////////////////////////////////////////////////////////////////////

#include
<iostream>using namespace std;//定义全局变量sum  作计数器来统计合法的布局。
int sum=0;//Find()函数,需要三个变量:
//                        一,数组a[]  存放当前已经有合法位置的皇后位置。
//                        二,当前要找到的第n  个皇后的合法位置。
//                        三,整数i  表示当前要将皇后放置的位置,Find()函数正是要
//                                  检测这个位置的合法性。如果不合法返回true,合法返回
//                                  false.
bool Find(int a[],int n,int i){
    
for(int k=0;k<n;k++){                                     //if 语句的三个判断的意义是
        if(a[k]==i||(a[k]-(n-k))==i||(a[k]+(n-k))==i){        //分别检测当前位置和
            return true;                                      //已经布置好的第k 个位置是否
        }                                                     //冲突,和第k 个位置的正反对
    }                                                         //角线是否 冲突。
      return false;
}
//递归算法求解八皇后的位置函数Bahuanghou()。
//此函数需要两个参数:
//                                             一,数组a[]  存放当前已经有合法位置的皇后位置。
//                                             二,当前要找到的第n  个皇后的合法位置。
void Bahuanghou(int a[],int n){
    
//每次进入循环要从0---7  检测位置的合法性。
    for(int i=0;i<8;i++){
        
if(Find(a,n,i)){                         //如果Find() 函数为true ,说明位置不和法。
            if(i==7){                            //这是如果已经找到了该行的最后一个元素
                return;                          //则函数不必继续执行,返回上一级递归。
            }
            
else                                 //如果当前位置没有到最后一个
                continue;                        //则继续向下循环以找到合法位置
        }
        a[n
++]=i;                                //则将这个位置存放到a[]中,并使个数n++.
        if(n==8){                                //如果当前n =8 则说明找到了一组合法的布局。
            cout<<""<< ++sum<<""<<"\t";      //sum计数器记录这组的存在。
            for(int k=0;k<8;k++)                 //输出这组合法布局。
                cout<<a[k]<<"  ";                                           
            cout
<<endl;                          //输出换行,以便下一组在下一行输出。
            return;                              //返回上一级递归。
        }                                        //如果n!=8 继续递归,以寻找下一个合法位置。 
        Bahuanghou(a,  n);                       //非常重要的一步,每次递归返回时都要将前
        a[--n]=-1;                               //一个合法a[n-1] 删除,因为当递归结束时,
    }                                            //的位置都不和法,在这些情况下都要,更新
}                                                //前一个和法位置。//主函数。                                                               
int main(){
    
int a[8];                                    //定义存放位置的数组a[].
    for(int k=0;k<8;k++)                         //将数组中的值初始化为-1,表示没有合法位置 
        a[k]=-1;                                 //存入。 
    int n=0;                                     //定义n记录当前找到合法位置的个数。
    Bahuanghou(a,n);                             //递归查找合法的八皇后位置。
    cout<<"合法的位置共"<<sum<<"";             //输出合法位置总数。                                
    return 0;
}