| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 481 人关注过本帖, 1 人收藏
标题:皇后问题
只看楼主 加入收藏
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
结帖率:100%
收藏(1)
已结贴  问题点数:50 回复次数:4 
皇后问题
程序代码:
#include<stdio.h>
#define MAX 6
int a[MAX];
int fire(int a[],int i) //判断和前买你的皇后有没有冲突
{
    int n;
    for(n=0;n<i;n++)
    if(a[n]==a[i]||abs(a[n]-a[i])/abs(n-i)==1)
    return 1;
    return 0;
}
int main()
{
    int i;
    int a[MAX];
    for(i=0;i<MAX;i++)//初始化在第一格
    a[i]=1;
    for(i=0;i<MAX;)//判断各行的皇后位置
    {
        if(fire(a,i))
        {
            a[i]++;// 有冲突的时候,下一个格
            while(a[i]>MAX)// 当这个值大于MAX的时候说明已经超出了棋盘的宽,循环向上选着。
            {
                a[i]=1;
                a[--i]++;//  i--; a[i]++;
            }
        }
        else
        i++;// 如果这个点的皇后与前面的不冲突,继续选着下一个位置。
    }
    for(i=0;i<MAX;i++,printf("\n"))//输出皇后相对位置
    {
    for(int n=1;n<a[i];n++)
    printf(" 0 ");
    printf(" 1 ");
    for(int n=a[i]+1;n<=MAX;n++)
    printf(" 0 ");
    }
    return 0;
}
各位大虾千万不要用递归呀,我到现在还不知道递归是怎么算出来的。
这个能算出 MAX =4,5的但算不出6,7,8的了···不知道什么原因。thanks!
搜索更多相关主题的帖子: 皇后 
2010-11-15 16:01
fightingsss
Rank: 6Rank: 6
等 级:侠之大者
帖 子:97
专家分:471
注 册:2010-11-12
收藏
得分:50 
看了以后感到纠结。。。
2010-11-19 12:36
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
我更纠结。
2010-11-19 14:33
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
好吧   我承认,我今晚才知道我怎么错了···
if(a[n]==a[i]||abs(a[n]-a[i])/abs(n-i)==1)
    return 1;
这儿错了,abs(a[n]-a[i])/abs(n-i)这个判断里不能这样,因为5/4  也等于 1;
把它改为abs(a[n]-a[i])==abs(n-i)就行了。
我死在了浅水地方。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 15
int a[MAX];
int fire(int a[],int i) //判断和前买你的皇后有没有冲突
{
    int n;
    for(n=0;n<i;n++)
    if(a[n]==a[i]||abs(a[n]-a[i])==abs(n-i))
       return 1;
    return 0;
}
int main()
{
    int i;
    int a[MAX];
    for(i=0;i<MAX;i++)//初始化在第一格
        a[i]=1;
    for(i=0;i<MAX;)//判断各行的皇后位置
    {
        if(fire(a,i))
        {
            a[i]++;// 有冲突的时候,向右一格
            while(a[i]>MAX)// 当这个值大于MAX的时候说明已经超出了棋盘的宽,循环向上选着。
            {
                a[i]=1;
                a[--i]++;//  i--; a[i]++;
            }
        }
        else
        i++;// 如果这个点的皇后与前面的不冲突,继续选着下一个位置。
     }
    for(i=0;i<MAX;i++,printf("\n"))//输出皇后相对位置
    {
        for(int n=1;n<=MAX;n++)
            n==a[i]?printf(" * "):printf(" . ");
    }
    return 1;
}
o(︶︿︶)o    认错了我。
2010-11-21 23:49
asions59
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-12-2
收藏
得分:0 


.........
为什么我在TC上运行了之后有错的...
2010-12-02 16:19
快速回复:皇后问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031700 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved