• <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中文字幕| 99久久成人国产精品免费| 国产午夜久久影院| 亚洲国产成人久久综合野外| 久久久久亚洲AV无码观看| 久久婷婷五月综合97色 | 色妞色综合久久夜夜| 久久无码AV中文出轨人妻| 久久A级毛片免费观看| 精品国产综合区久久久久久| 亚洲香蕉网久久综合影视 | 亚洲人成无码www久久久| 亚洲女久久久噜噜噜熟女| 日韩一区二区久久久久久| 97久久国产露脸精品国产| 久久久久久久久久免免费精品| 99久久精品免费看国产一区二区三区| 94久久国产乱子伦精品免费| 人妻久久久一区二区三区| 久久国产精品免费一区二区三区| 无码伊人66久久大杳蕉网站谷歌| 亚洲成av人片不卡无码久久| 国产成人久久久精品二区三区| 久久天天躁狠狠躁夜夜96流白浆| 免费久久人人爽人人爽av| 久久久久女教师免费一区| 国产69精品久久久久99尤物| 国产韩国精品一区二区三区久久| 午夜精品久久久久久久久| 亚洲人成伊人成综合网久久久| 国内精品久久久久影院亚洲| 免费精品久久久久久中文字幕| 久久精品女人天堂AV麻| 久久久久亚洲AV无码去区首| 国产真实乱对白精彩久久| 国产国产成人久久精品| 久久精品成人免费观看97| 国产国产成人久久精品| 久久男人中文字幕资源站| 香蕉久久影院|