| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 513 人关注过本帖
标题:死磕八皇后,与递归比,这样也不慢吧?请高手评价。
只看楼主 加入收藏
C_lscll
Rank: 2
等 级:论坛游民
帖 子:22
专家分:18
注 册:2014-2-6
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
死磕八皇后,与递归比,这样也不慢吧?请高手评价。
我只学了两个月,自己乱想的算法。
/*************************************************
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)
        {
            if ((a==b)||((a-1)==b)||((a+1)==b))
                continue;
            for (c=0; c<8; ++c)
            {
                if ((b==c)||((b-1)==c)||((b+1)==c))
                    continue;
                for (d=0; d<8; ++d)
                {
                    if ((c==d)||((c-1)==d)||((c+1)==d))
                        continue;
                    for (e=0; e<8; ++e)
                    {
                        if ((d==e)||((d-1)==e)||((d+1)==e))
                            continue;
                        for (f=0; f<8; ++f)
                        {
                            if ((e==f)||((e-1)==f)||((e+1)==f))
                                continue;
                            for (g=0; g<8; ++g)
                            {
                                if ((f==g)||((f-1)==g)||((f+1)==g))
                                    continue;
                                for (h=0; h<8; ++h)
                                {
                                    if ((g==h)||((g-1)==h)||((g+1)==h))
                                        continue;
                                    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-04-03 22:43
C_lscll
Rank: 2
等 级:论坛游民
帖 子:22
专家分:18
注 册:2014-2-6
收藏
得分:0 
我自己顶自己,
你很厉害了哦!!!!!!!!!!!!!!!!!!
2014-04-03 22:44
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:7 
嘿嘿
我是来看喜庆的2楼的
2014-04-04 00:36
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:7 
有待改善,加油!

程序代码:
int pp (int *a,int *b,int *c,int *d,int *e,int *f,int *g,int *h)
{
    int flag[8]  = {0};
    int i, ar[8] = {*a, *b, *c, *d, *e, *f, *g, *h};
    
    for (i = 0;i < 8;i += 1)
    {
        if (flag[ar[i]])    return 1;
        flag[ar[i]] = 1;
    }
    return 0;
}


[fly]存在即是合理[/fly]
2014-04-04 13:39
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:7 
你计算过你的算法的复杂度么?


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

                                                                                                                    Black Cat      Hello Tomorrow~
2014-04-04 23:24
破灬王
Rank: 2
等 级:论坛游民
帖 子:12
专家分:18
注 册:2014-1-17
收藏
得分:0 
看的有点头晕 ,我都学了几个月了 哎看来的加油了 。。
2014-04-16 15:35
dongshimou
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:44
专家分:152
注 册:2014-1-8
收藏
得分:0 

直接DFS 搜就好了。
2014-04-18 21:14
dongshimou
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:44
专家分:152
注 册:2014-1-8
收藏
得分:0 
程序代码:
#include<cstdio>
#include<cstring>
int c[25],ans,n;
bool g[25][25];
int dfs(int i)
{
    if(i==n)
    {
        ans++;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            printf("%d ",g[i][j]);
            printf("\n");
        }
        printf("\n");
    }
    else
    for(int j=0;j<n;j++)
    {
        bool ok=1;
        c[i]=j;
        for(int k=0;k<i;k++)
        if(c[i]==c[k]||i-c[i]==k-c[k]||i+c[i]==k+c[k])
        {
            ok=0;break;
        }
        if(ok)
        {
            g[i][j]=1;
            dfs(i+1);
            g[i][j]=0;
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(c,0,sizeof(c));
        ans=0;
        dfs(0);
        printf("%d\n",ans);
    }
}
2014-04-18 21:21
快速回复:死磕八皇后,与递归比,这样也不慢吧?请高手评价。
数据加载中...
 
   



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

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