• <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 閱讀(267) 評論(0)  編輯 收藏 引用
             
            欧美午夜精品久久久久久浪潮| 亚洲va久久久噜噜噜久久| 久久只有这精品99| 亚洲午夜无码久久久久| 26uuu久久五月天| 久久精品国产亚洲AV忘忧草18| 久久精品国产亚洲AV无码娇色| 精品久久久久久国产免费了| 久久国产欧美日韩精品| 老司机国内精品久久久久| 精品久久久久久久久免费影院| 精品999久久久久久中文字幕| 久久男人AV资源网站| MM131亚洲国产美女久久| 婷婷久久综合九色综合九七| 成人国内精品久久久久一区| 一本久久a久久精品综合香蕉| 国产成人精品久久免费动漫| 亚洲人成电影网站久久| 日本精品久久久久中文字幕8| 深夜久久AAAAA级毛片免费看| 久久96国产精品久久久| 久久精品国产亚洲AV香蕉| 精品久久久久久国产三级| 精品久久久久久无码中文字幕一区| 久久久精品日本一区二区三区| 91精品国产色综合久久| 成人午夜精品无码区久久| 精品久久国产一区二区三区香蕉| 国产成人久久精品激情| 久久精品卫校国产小美女| 久久久WWW成人免费毛片| 欧美777精品久久久久网| 亚洲女久久久噜噜噜熟女| 久久久综合香蕉尹人综合网| 欧美日韩中文字幕久久伊人| 性欧美丰满熟妇XXXX性久久久 | 久久中文字幕人妻丝袜| 国产综合精品久久亚洲| 97久久精品人妻人人搡人人玩| 久久精品国产AV一区二区三区|