• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            編城浪子的博客
            游戲開發、圖形引擎
             
            八皇后棋局:即在一個8×8的方格棋局中放置8個棋子,其中每兩個棋子皆不同行、不同列、不同斜線,求出任意一種放置方法,并打印出來。比如,如下棋局即滿足以上條件:
            0 0 0 1 0 0 0 0
            0 0 0 0 0 1 0 0
            1 0 0 0 0 0 0 0
            0 0 0 0 1 0 0 0
            0 1 0 0 0 0 0 0
            0 0 0 0 0 0 0 1
            0 0 1 0 0 0 0 0
            0 0 0 0 0 0 1 0
            以上矩陣中,1代表方格中有棋子,0代表方格中無棋子,可以看出,任意兩棋子不同行,不同列,且不同斜線。
            求出八皇后棋局有很多種,這里介紹本人自創的一種--隨機試探法。故名思義,試探性地在某一行的某一位置放置一個棋子(以下簡稱放子),判斷該棋子是否打破棋局規則,如果未打破,則繼續在下一行放子;如果打破規則,則重復試探其他位置。為了方便程序實現,也為了更好理解,不妨依次對第1、2、...、8行,如此順序,試探性的放子。
            可以預測,很可能的一種情況是:還未對第八行進行放子時(比如,程序才進行到第5行),無論對中間的某一行(比如第六行)的任何一個位置放子,都不能滿足棋局規則,這種情況稱為死局。程序運行結果表明這種預測是合理的,一般要進行十幾遍從頭試探才能成功獲得八皇后棋局。
            以下給出整個程序:
            // eight_queen.cpp : 定義控制臺應用程序的入口點。
            //
            #include <iostream>
            #include <tchar.h>

            #include "stdafx.h"
            #include "time.h"

            /** 在新行中第pos個位置打印一個*號
            */
            void print_star(int pos)
            {
             char str[] = "|                 |\n";
             str[pos*2] = '*';
             printf(str);
            }

            /** get a random num between 0,1,2,...7
            */
            int get_rand_num()
            {
             return rand()%8;
            }

            /** 打印8×8矩陣
            */
            void print_flag(bool flag[8][8])
            {
             //打印星號矩陣
             for(int i=0;i<8;i++){
              for(int j=0;j<8;j++){
               if(flag[i][j] == true){
                print_star(j+1);
                break;
               }
              }
             }
             //打印0-1矩陣
             for(int i=0;i<8;i++){
              for(int j=0;j<8;j++){
               printf(" %d", flag[i][j]==1?0:1);
              }
              printf("\n");
             }
            }

            /** result = (i<=num<=j)
            */
            bool isBetween(int num, int i, int j)
            {
             return (num>=i)&&(num<=j);
            }

            /** test whether flag[i][j] can be true
             對于flag[8][8]矩陣,判斷可否在第row行,第col列放入一個棋子
            */
            bool test_value(bool flag[8][8], int row, int col)
            {
             //判斷橫
             for(int i=0;i<8;i++){
              if(true == flag[i][col]){
               return false;
              }
             }
             //判斷豎
             for(int j=0;j<8;j++){
              if(true == flag[row][j]){
               return false;
              }
             }
             //判斷斜方向
             for(int i=1;i<8;i++){
              if(isBetween(row-i, 0, 7)&&isBetween(col-i, 0, 7)){
               if(true == flag[row-i][col-i]){
                return false;
               }
              }
              else{
               break;
              }
             }
             //判斷斜方向
             for(int i=1;i<8;i++){
              if(isBetween(row+i, 0, 7)&&isBetween(col+i, 0, 7)){
               if(true == flag[row+i][col+i]){
                return false;
               }
              }
              else{
               break;
              }
             }
             //判斷斜方向
             for(int i=1;i<8;i++){
              if(isBetween(row-i, 0, 7)&&isBetween(col+i, 0, 7)){
               if(true == flag[row-i][col+i]){
                return false;
               }
              }
              else{
               break;
              }
             }
             //判斷斜方向
             for(int i=1;i<8;i++){
              if(isBetween(row+i, 0, 7)&&isBetween(col-i, 0, 7)){
               if(true == flag[row+i][col-i]){
                return false;
               }
              }
              else{
               break;
              }
             }
             flag[row][col] = true;
             return true;
            }


            #define RAND_NUM 20
            //遞歸函數
            bool recursive(bool flag[8][8], int i)
            {
             if(i==8)
              return true;
             int num = 0;
             while(num<RAND_NUM){
              int j = get_rand_num();
              if(test_value(flag, i, j)){
               break;
              }
              num++;
             }
             if(num<RAND_NUM)
              return recursive(flag, i+1);
             else
              return false;
            }
            /** get a queen fig
            */
            bool get_queen_fig(bool flag[8][8])
            {
             //棋局初始化
             for(int i=0;i<8;i++){
              for(int j=0;j<8;j++){
               flag[i][j] = false;
              }
             }

             return recursive(flag, 0);
            }

            #define LOOP_NUM 30
            int _tmain(int argc, _TCHAR* argv[])
            {
             srand(time(0));
             for(int i=1;i<=8;i++)
              print_star(i);

             bool flag[8][8];
             int loops = 0;
             do
             {
              loops++;
              if(loops>LOOP_NUM)
              {
               break;
              }
              printf("has trying get a queen figure for %d times\n", loops);
             }
             while(false == get_queen_fig(flag));

             if(loops>LOOP_NUM)
              printf("failed to get a queen figure!\n");
             else{
              printf("succeed to get a queen figure!\n");
              print_flag(flag);
             }


             return 0;
            }

            posted on 2008-10-21 22:38 zengfancy 閱讀(272) 評論(0)  編輯 收藏 引用
             
            久久久久亚洲精品天堂| 精品多毛少妇人妻AV免费久久| 麻豆精品久久久久久久99蜜桃 | 久久天天躁狠狠躁夜夜2020一| 亚洲欧美成人久久综合中文网| 亚洲精品乱码久久久久久蜜桃图片| 亚洲人成网亚洲欧洲无码久久| 高清免费久久午夜精品| 无码国内精品久久人妻麻豆按摩| 午夜精品久久久久久99热| yellow中文字幕久久网| 日韩人妻无码精品久久免费一| 国产精品99久久久久久宅男 | 久久精品中文字幕第23页| 色播久久人人爽人人爽人人片AV| 色综合久久88色综合天天| 欧美日韩久久中文字幕| 嫩草影院久久99| 婷婷五月深深久久精品| 亚洲伊人久久成综合人影院 | 国产aⅴ激情无码久久| 99精品伊人久久久大香线蕉| 人妻无码αv中文字幕久久琪琪布| 久久91综合国产91久久精品| 精品蜜臀久久久久99网站| 久久国产精品无| 久久涩综合| 一级做a爰片久久毛片看看| 99久久无码一区人妻| 97r久久精品国产99国产精| 久久青青草原精品国产| 亚洲成色www久久网站夜月| 亚洲精品tv久久久久久久久| 少妇被又大又粗又爽毛片久久黑人 | 久久99久久99精品免视看动漫| 中文字幕无码久久人妻| 性做久久久久久久久久久| 亚洲精品无码久久久久AV麻豆| 亚洲伊人久久综合影院| 免费无码国产欧美久久18| 中文国产成人精品久久不卡|