zoukankan      html  css  js  c++  java
  • 八皇后问题的学习

    方法一:(穷举法与剪支)

     
    1. void main()  
    2. {  
    3.     int a[9];  
    4.     int i,t=1;  
    5.     for(a[1]=1;a[1]<9;a[1]++)  
    6.         for(a[2]=1;a[2]<9;a[2]++)  
    7.         {  
    8.             if(!Check(a,2)) continue;  
    9.             for(a[3]=1;a[3]<9;a[3]++)  
    10.             {  
    11.                 if(!Check(a,3)) continue;  
    12.                 for(a[4]=1;a[4]<9;a[4]++)  
    13.                 {  
    14.                     if(!Check(a,4)) continue;  
    15.                     for(a[5]=1;a[5]<9;a[5]++)  
    16.                     {  
    17.                         if(!Check(a,5)) continue;  
    18.                         for(a[6]=1;a[6]<9;a[6]++)  
    19.                         {  
    20.                             if(!Check(a,6)) continue;  
    21.                             for(a[7]=1;a[7]<9;a[7]++)  
    22.                             {  
    23.                                 if(!Check(a,7)) continue;  
    24.                                 for(a[8]=1;a[8]<9;a[8]++)  
    25.                                 {  
    26.                                     if(!Check(a,8)) continue;  
    27.                                     else   
    28.                                     {  
    29.                                         printf("第%d种解法: ",t++);  
    30.                                         for(i=1;i<9;i++)  
    31.                                             printf("第%d个皇后:%d ",i,a[i]);  
    32.                                         printf(" ");  
    33. }       }   }   }   }   }   }   }   }  
     
    1. /////////////////////////////////Check函数功能:检验第n行的皇后是否和之前的皇后有冲突,没有的话返回1  
    2. int Check(int a[],int n)  
    3. {  
    4.     for(int i=1;i<n;i++)  
    5.     {  
    6.         if(abs(a[i]-a[n])==abs(i-n) || a[i]==a[n])//////////////见下面注释  
    7.             return 0;  
    8.     }  
    9.     return 1;  

    方法二:(回溯算法)

    #include<stdio.h>
    #include<math.h>

    int Check(int a[], int n);
    int main()
    {
        int a[256] = { 0 };
        int i = 1, j, n, t = 1;////////////////////////////////////i表示当前正在搜索第i行的皇后位置  
        printf("请输入几皇后?n=");
        scanf_s("%d", &n);
        while (i>0)
        {
            for (a[i]++; a[i] <= n; a[i]++)   ////////////////当前行的皇后试探
            {
                if (Check(a, i))//////////////////////////////如果第i行的皇后与之前的皇后位置上没有冲突,则break跳出循环  
                    break;
            }
            if (a[i] <= n)/////////////////////////////////////如果a[i]<=n,即上面的for循环是由“break;”跳出来的,即第i行皇后的位置符合条件  
            {
                if (i == n)////////////////////////////////////找到一组解,输出  
                {
                    printf("第%d种解法: ", t++);
                    for (j = 1; j <= n; j++)
                        printf("第%d个皇后:%d ", j, a[j]);
                    printf(" ");
                }
                else////////////////////////////////////////未找完  
                {
                    i++;
                    a[i] = 0;
                }
            }
            else
                i--;////////////////////////////////////////回溯 ---当前行的位置全部找完
        }
    }


    int Check(int a[], int n)
    {
        for (int i = 1; i<n; i++)
        {
            if (abs(a[i] - a[n]) == abs(i - n) || a[i] == a[n])//////////////见下面注释  
                return 0;
        }
        return 1;
    }

    方法三:(递归算法)

    #include<stdio.h>
    #include<stdlib.h>
    int a[20], n, i, j, t = 1;////////////////////////////////////////全局变量  


    int Check(int a[], int n)
    {
        for (int i = 1; i<n; i++)
        {
            if (abs(a[i] - a[n]) == abs(i - n) || a[i] == a[n])//////////////见下面注释  
                return 0;
        }
        return 1;
    }

    void Try(int i)
    {
        int j, k;
        for (j = 1; j <= n; j++)
        {
            a[i] = j;   ///////////////////////////////////////////当前行解法的所有尝试
            if (Check(a, i))///////////////////////////////////////如果第j列不会与之前的皇后冲突  
            {
                if (i<n)//////////////////////////////////////////如果i<n,即还没有找到八个皇后,继续递归  
                    Try(i + 1);
                else ////////////////////////////////////////////如果找到了一组解就输出  
                {
                    printf("第%d种解法: ", t++);
                    for (k = 1; k <= n; k++)
                        printf("第%d个皇后:%d ", k, a[k]);
                    printf(" ");
                }
            }
        }
    }

    void main()
    {
        printf("几皇后?n=");
        scanf_s("%d", &n);
        Try(1);
    }

    (原文链接:http://blog.csdn.net/bone_ace/article/details/41419695

  • 相关阅读:
    GetForegroundWindow 与 GetActiveWindow 的区别 回复 "delphier" 的问题
    给 TStringGrid 添加鼠标拖动功能 回复 "dxx" 的问题
    Delphi 的编译指令(3): 常用的预定义条件标识符
    Delphi 的编译指令(1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDIF
    用多媒体库 Bass.dll 播放 mp3 [17] : 如何从内存流播放 回复 "小李子子" 的问题
    Delphi 的编译指令(4): 编译指令全表(未完)
    窗口跟随 回复 "heyongan" 的问题
    字符串转换到指定格式的宽字符 回复 "厨师" 的问题
    Dll 使用 PChar 参数的小例子 回复 "linximf" 的问题
    上周热点回顾(5.286.3)
  • 原文地址:https://www.cnblogs.com/lux-ace/p/5230936.html
Copyright © 2011-2022 走看看