﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-如果·喜欢</title><link>http://www.cnitblog.com/wwq100/</link><description>一切　一切的一切　　还没有想好</description><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 22:26:06 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 22:26:06 GMT</pubDate><ttl>60</ttl><item><title>八皇后问题</title><link>http://www.cnitblog.com/wwq100/archive/2007/12/15/37714.html</link><dc:creator>西西里</dc:creator><author>西西里</author><pubDate>Fri, 14 Dec 2007 23:59:00 GMT</pubDate><guid>http://www.cnitblog.com/wwq100/archive/2007/12/15/37714.html</guid><wfw:comment>http://www.cnitblog.com/wwq100/comments/37714.html</wfw:comment><comments>http://www.cnitblog.com/wwq100/archive/2007/12/15/37714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/wwq100/comments/commentRss/37714.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wwq100/services/trackbacks/37714.html</trackback:ping><description><![CDATA[
		<br />人工智能的老师让我们做八皇后问题的算法，所以就整理了网上的两种算法，一个是用C语言做的，一个用的C++，全部都在VC++6.0上能过：<br /><br />C语言版：<br /><br />#include&lt;stdio.h&gt;<br />#define 
NUM 8 /*定义数组的大小*/<br />int a[NUM+1];<br />void main()<br />{<br />    int 
i,k,flag,not_finish=1,count=0;<br />    i=1; 
/*正在处理的元素下标，表示前i-1个元素已符合要求，正在处理第i个元素*/<br />    a[1]=1; /*为数组的第一个元素赋初值*/<br />    
printf("The possible configuration of 8 queens are:\n");<br />    
while(not_finish) /*not_finish=1:处理尚未结束*/<br />    {<br />        
while(not_finish&amp;&amp;i&lt;=NUM) /*处理尚未结束且还没处理到第NUM个元素*/<br />        {<br />    
        for(flag=1,k=1;flag&amp;&amp;k&lt;i;k++) /*判断是否有多个皇后在同一行*/<br />        
        if(a[k]==a[i])flag=0;<br />                
for(k=1;flag&amp;&amp;k&lt;i;k++) /*判断是否有多个皇后在同一对角线*/<br />                    
if((a[i]==a[k]-(k-i))||(a[i]==a[k]+(k-i))) flag=0;<br />                    
if(!flag) /*若存在矛盾不满足要求，需要重新设置第i个元素*/<br />                    {<br />                
        if(a[i]==a[i-1]) /*若a[i]的值已经经过一圈追上a[i-1]的值*/<br />                        
{<br />                            i--; /*退回一步，重新试探处理前一个元素*/<br />                
            if(i&gt;1&amp;&amp;a[i]==NUM)<br />                                
a[i]=1; /*当a[i]为NUM时将a[i]的值置1*/<br />                            else 
if(i==1&amp;&amp;a[i]==NUM)<br />                                not_finish=0; 
/*当第一位的值达到NUM时结束*/<br />                            else a[i]++; 
/*将a[i]的值取下一个值*/<br />                        }<br />                        else 
if(a[i]==NUM) a[i]=1;<br />                        else a[i]++; 
/*将a[i]的值取下一个值*/<br />                    }<br />                    else 
if(++i&lt;=NUM)<br />                        if(a[i-1]==NUM) a[i]=1; 
/*若前一个元素的值为NUM则a[i]=1*/<br />                        else a[i]=a[i-1]+1; 
/*否则元素的值为前一个元素的下一个值*/<br />        }<br />        if(not_finish)<br />        {<br />    
        ++count;<br />            printf((count-1)%3?" \n[%2d]: ":" \n[%2d]: 
",count);<br />            for(k=1;k&lt;=NUM;k++) /*输出结果*/<br />                
printf(" %d",a[k]);<br />            if(a[NUM-1]&lt;NUM) a[NUM-1]++; 
/*修改倒数第二位的值*/<br />            else a[NUM-1]=1;<br />            i=NUM-1; 
/*开始寻找下一个足条件的解*/<br />        }<br />    }<br /><br />    
printf("\n");<br />}<br /><br /><br /><font color="#ff0000">///////////////////////////////////////////////////////////////////////////////////////////////////////</font><br />C++版：<br /><br />#include 
&lt;iostream&gt;<br />#include &lt;math.h&gt;<br />#include 
&lt;malloc.h&gt;<br /><br />using namespace std;<br /><br />int *position; 
//放置的位置<br />int queen; //皇后数目<br />int count; //第N种可能性<br /><br />//判断第n行是否放置皇后<br />bool 
SignPoint(int n)<br />{<br />    for (int i=0;i&lt;n;i++)<br />    {<br />        if 
(*(position+i) == *(position+n)) //该列已经放置过皇后了<br />            return 
false;<br />        if (abs(*(position+i) - *(position+n)) == n-i) 
//对角线已经放置过了<br />            return false;<br />    }<br />    return 
true;<br />}<br /><br />//设置皇后<br />void SetQueen(int n=0)<br />{<br />    if 
(queen==n)<br />    {<br />        //该处可以改成自己想要的显示方式<br />        printf("NO.%d: 
",++count);<br />        printf("\n");<br />        for (int 
i=0;i&lt;queen;i++)<br />        {<br />            for (int 
j=0;j&lt;queen;j++)<br />            {<br />                if (j == 
position[i])<br />                {<br />                    printf("* ");<br />    
            }<br />                else<br />                {<br />                
    printf("0 ");<br />                }<br />            }<br />            
printf("\n");<br />        }<br />        printf("\n");<br />        return;<br />    
}<br />    else<br />    {<br />        for (int i=0;i&lt;queen;i++)<br />        
{<br />            position[n] = i;<br />            <br />            
if(SignPoint(n))//如果该位置放置皇后正确的话,则到下一行<br />            {<br />                
SetQueen(n+1);<br />            }<br />        }<br />    }<br />}<br /><br />void 
main()<br />{<br />    cout&lt;&lt;"请输入皇后的总数:"&lt;&lt;endl;<br />    
cin&gt;&gt;queen;<br />    position = (int*)malloc(sizeof(int));<br />    
SetQueen();<br />    cout&lt;&lt;"摆放完毕"&lt;&lt;endl;<br />    cin.get();<br />    
cin.get();<br />}<br /><br /><img src ="http://www.cnitblog.com/wwq100/aggbug/37714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wwq100/" target="_blank">西西里</a> 2007-12-15 07:59 <a href="http://www.cnitblog.com/wwq100/archive/2007/12/15/37714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>