• <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)  編輯 收藏 引用
             
            久久人人爽人人人人爽AV| 久久久久这里只有精品| 男女久久久国产一区二区三区| 香蕉久久夜色精品国产尤物| 伊人久久大香线蕉综合Av| 狼狼综合久久久久综合网| 久久精品国产精品国产精品污| 久久伊人亚洲AV无码网站| 久久亚洲日韩精品一区二区三区| 精品久久一区二区| 99久久精品免费看国产一区二区三区| 好久久免费视频高清| 久久无码国产专区精品| 成人免费网站久久久| 中文字幕无码av激情不卡久久| 99re这里只有精品热久久| 久久久久久国产a免费观看黄色大片| 99久久久精品免费观看国产| 亚州日韩精品专区久久久| 中文字幕亚洲综合久久| 无码伊人66久久大杳蕉网站谷歌 | 久久久久久国产精品无码下载| 亚洲AV无一区二区三区久久| 婷婷久久综合| 久久久精品无码专区不卡| 亚洲狠狠综合久久| 国产成人久久AV免费| 精品久久久久久中文字幕大豆网| 青青草原1769久久免费播放| 久久超碰97人人做人人爱| 中文国产成人精品久久不卡| 日本WV一本一道久久香蕉| 亚州日韩精品专区久久久| 亚洲精品高清一二区久久| 久久国产精品偷99| 久久精品国产亚洲7777| 久久er国产精品免费观看8| 99久久国产综合精品五月天喷水| 久久96国产精品久久久| 伊人久久综合热线大杳蕉下载| 青青热久久综合网伊人|