| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 373 人关注过本帖
标题:自学两月C,自己搞了个8皇后垃圾算法。请高手指点。
只看楼主 加入收藏
C_lscll
Rank: 2
等 级:论坛游民
帖 子:22
专家分:18
注 册:2014-2-6
结帖率:0
收藏
 问题点数:0 回复次数:3 
自学两月C,自己搞了个8皇后垃圾算法。请高手指点。
/*************************************************
2014年3月28日 19:13:41
八皇后算法:
    1:用二维数组模拟8*8的棋盘;
    2:按照8皇后要求得出结论:没有任何两个皇后在同
一列,同一行。因此它们的坐标ar[行][列]不会有任何相同的数;
    3:用8个for穷尽8个皇后的坐标分布;
    4:按第二条规则排除同行或同列的结果;
    5:调用ff函数排除在同一斜线上的皇后的结果;
    6:剩下的就是最终结果。
*************************************************/
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
/*
    ff用于排除每行位置上的皇后斜线相交。
*/
int ff(int (*p)[8], int a, int b, int c, int d, int e, int f, int g, int h)
{
    int i=0, j=0,  k = 0, z = 0;
    int line[8] = {0, 1, 2, 3, 4, 5, 6, 7};
    int rank[8] = {a, b, c, d, e, f, g, h};

    for (z=0; z<8; ++z)
    {
        for(i=line[z]+1, j=rank[z]+1; (i<8) && (j<8); ++i, ++j)       //i 和 j必须同时变化。
        {
            if (1 == *(*(p+i)+j))
            {
                k=1;
                break;
            }
        }
    }
    for (z=0; z<8; ++z)
    {
        for(i=line[z]-1, j=rank[z]-1; (i>=0) && (j>=0); --i, --j)
        {
            if (1 == *(*(p+i)+j))
            {
                k=1;
                break;
            }
        }
    }
    for (z=0; z<8; ++z)
    {
        for(i=line[z]+1, j=rank[z]-1; (i<8) && (j>=0); ++i, --j)
        {
            if (1 == *(*(p+i)+j))
            {
                k=1;
                break;
            }
        }
    }
    for (z=0; z<8; ++z)
    {
        for(i=line[z]-1, j=rank[z]+1; (i>=0) && (j<8); --i, ++j)
        {
            if (1 == *(*(p+i)+j))
            {
                k=1;
                break;
            }
        }
    }

    return k;
}

int pp (int *a,int *b,int *c,int *d,int *e,int *f,int *g,int *h)
{
    int i=1;
    int n, m, t=0;
    int ar[8] = {*a, *b, *c, *d, *e, *f, *g, *h};
   
    for (n=0; n<8-1; ++n)
    {
        for (m=0; m<8-1-n; ++m)
        {
            if (ar[m] > ar[m+1])
            {
                t = ar[m];
                ar[m] = ar[m+1];
                ar[m+1] = t;
            }
        }
    }
    m=0;
    for (n=0; n<8; ++n)
    {
        if(ar[n+1] == ar[n])
        {
            m=1;
            break;
        }
    }
    if (0 == m)
        i=0;
   
    return i;
}

int main(void)
{
    int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, n=0, m=0, i, j, w, t=0;    //行是已知道的,把列分别标号a,b,c....h。用以确定每个数的坐标。
    int ar[8][8] = {0};
    int arr[8] = {0};

    for (a=0; a<8; ++a)
    {
        for (b=0; b<8; ++b)
        {
            for (c=0; c<8; ++c)
            {
                for (d=0; d<8; ++d)
                {
                    for (e=0; e<8; ++e)
                    {
                        for (f=0; f<8; ++f)
                        {
                            for (g=0; g<8; ++g)
                            {
                                for (h=0; h<8; ++h)
                                {
                                    if (0 == pp(&a, &b, &c, &d, &e, &f, &g, &h))
                                    {
                                        ar[0][a]=1;
                                        ar[1][b]=1;
                                        ar[2][c]=1;
                                        ar[3][d]=1;
                                        ar[4][e]=1;
                                        ar[5][f]=1;
                                        ar[6][g]=1;
                                        ar[7][h]=1;
                                        if (0 == ff(ar, a, b, c, d, e, f, g, h))
                                        {
                                            for (i=0; i<8; ++i)
                                            {
                                                for (j=0; j<8; ++j)
                                                {
                                                    printf("%6d", ar[i][j]);
                                                    if (7==j)
                                                        printf("\n\n");
                                                }
                                            }
                                            ++t;
                                            printf("t = %d\n", t);
                                            printf("\n\n");
                                            system("pause");
                                        }
                                        memset(ar, 0, sizeof(ar));    //清除上一次放到ar[][]内的数据,好重新下次循环
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}
搜索更多相关主题的帖子: include 
2014-03-28 19:25
C_lscll
Rank: 2
等 级:论坛游民
帖 子:22
专家分:18
注 册:2014-2-6
收藏
得分:0 
你自己顶了你自己一次!
2014-03-28 19:27
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
你写的也就太麻烦了吧,试试递归。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-03-28 20:15
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
你的代码我没仔细看,但是看到那么多循环嵌套,一般都有个说法:循环嵌套超过3重的算法一般就不用考虑了。。。

下面是我以前发过的一个帖子,如果有兴趣可以看看,里面有一楼我发过之前写过的八皇后代码【不过,,打印的时候排版不是很好看。。】

https://bbs.bccn.net/thread-414535-1-1.html

加油~

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-03-28 20:27
快速回复:自学两月C,自己搞了个8皇后垃圾算法。请高手指点。
数据加载中...
 
   



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

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