• <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>
            編城浪子的博客
            游戲開發(fā)、圖形引擎
            八皇后棋局:即在一個(gè)8×8的方格棋局中放置8個(gè)棋子,其中每?jī)蓚€(gè)棋子皆不同行、不同列、不同斜線,求出任意一種放置方法,并打印出來。比如,如下棋局即滿足以上條件:
            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代表方格中無(wú)棋子,可以看出,任意兩棋子不同行,不同列,且不同斜線。
            求出八皇后棋局有很多種,這里介紹本人自創(chuàng)的一種--隨機(jī)試探法。故名思義,試探性地在某一行的某一位置放置一個(gè)棋子(以下簡(jiǎn)稱放子),判斷該棋子是否打破棋局規(guī)則,如果未打破,則繼續(xù)在下一行放子;如果打破規(guī)則,則重復(fù)試探其他位置。為了方便程序?qū)崿F(xiàn),也為了更好理解,不妨依次對(duì)第1、2、...、8行,如此順序,試探性的放子。
            可以預(yù)測(cè),很可能的一種情況是:還未對(duì)第八行進(jìn)行放子時(shí)(比如,程序才進(jìn)行到第5行),無(wú)論對(duì)中間的某一行(比如第六行)的任何一個(gè)位置放子,都不能滿足棋局規(guī)則,這種情況稱為死局。程序運(yùn)行結(jié)果表明這種預(yù)測(cè)是合理的,一般要進(jìn)行十幾遍從頭試探才能成功獲得八皇后棋局。
            以下給出整個(gè)程序:
            #include <iostream>
            #include <tchar.h>
            // eight_queen.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
            //
            #include "time.h"

            /** 在新行中第pos個(gè)位置打印一個(gè)*號(hào)
            */
            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])
            {
            //打印星號(hào)矩陣
            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
            對(duì)于flag[8][8]矩陣,判斷可否在第row行,第col列放入一個(gè)棋子
            */
            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
            //遞歸函數(shù)
            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:49 zengfancy 閱讀(2704) 評(píng)論(8)  編輯 收藏 引用
            Comments
            • # re: 八皇后問題的一種解法-隨機(jī)試探法
              thermos
              Posted @ 2008-10-21 23:35
              拉斯維加斯算法 嗯   回復(fù)  更多評(píng)論   
            • # re: 八皇后問題的一種解法-隨機(jī)試探法[未登錄]
              Albert
              Posted @ 2008-10-22 10:31
              你這叫隨機(jī)試探?我怎么沒感覺出來,跟經(jīng)典的解放有一點(diǎn)不同么?  回復(fù)  更多評(píng)論   
            • # re: 八皇后問題的一種解法-隨機(jī)試探法
              zengfancy
              Posted @ 2008-10-22 16:21
              什么是拉斯維加斯算法?我不知道。或許它和我想到一處去了。@thermos
                回復(fù)  更多評(píng)論   
            • # re: 八皇后問題的一種解法-隨機(jī)試探法
              zengfancy
              Posted @ 2008-10-22 16:23
              我理解的隨機(jī)試探法就是填棋的時(shí)候位置是隨機(jī)生成的。@Albert
                回復(fù)  更多評(píng)論   
            • # re: 八皇后問題的一種解法-隨機(jī)試探法
              金山毒霸2008
              Posted @ 2008-10-22 21:36
              你的這個(gè)解法怎么這么長(zhǎng),我記得上學(xué)時(shí)設(shè)計(jì)的很短的。  回復(fù)  更多評(píng)論   
            • # re: 八皇后問題的一種解法-隨機(jī)試探法
              merlinfang
              Posted @ 2008-10-28 19:12
              求出任意一種算法,還是使用貪婪法快啊  回復(fù)  更多評(píng)論   
            • # re: 八皇后問題的一種解法-隨機(jī)試探法
              zengfancy
              Posted @ 2008-10-31 20:54
              對(duì)于貪婪算法,我不是很懂。。  回復(fù)  更多評(píng)論   
            • # re: 八皇后問題的一種解法-隨機(jī)試探法
              merlinfang
              Posted @ 2008-11-01 11:48
              貪婪法比較簡(jiǎn)單,就是一種策略
              我所了解的如下:
              象一般的求解是遍歷(你這里是隨機(jī)遍歷), 但貪婪法在遍歷之前先進(jìn)行排序,即對(duì)可遍歷的子節(jié)點(diǎn)進(jìn)行排序,排序的規(guī)則是誰(shuí)的后續(xù)空格少,誰(shuí)就先遍歷.

              我以前測(cè)試的速度要快N倍,特別到幾十皇后的時(shí)候,遍歷法根本跑不動(dòng)

                回復(fù)  更多評(píng)論   

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


             
            久久这里都是精品| 国产午夜福利精品久久2021| 久久97精品久久久久久久不卡| 久久精品国产乱子伦| 久久99九九国产免费看小说| 久久国产视屏| 91精品国产高清久久久久久io| 久久夜色精品国产噜噜噜亚洲AV | 狠狠色婷婷综合天天久久丁香| 久久精品蜜芽亚洲国产AV| 精品久久无码中文字幕| 国产亚洲精品自在久久| 青青青伊人色综合久久| 久久久91精品国产一区二区三区 | 国产高清国内精品福利99久久| 国産精品久久久久久久| 亚洲第一永久AV网站久久精品男人的天堂AV| 99久久www免费人成精品| 久久久这里只有精品加勒比| 久久av无码专区亚洲av桃花岛| 色综合久久中文综合网| 亚洲国产成人精品女人久久久 | 久久久精品久久久久久| 东方aⅴ免费观看久久av | 亚洲av成人无码久久精品| 久久久91精品国产一区二区三区| 午夜福利91久久福利| 久久99热国产这有精品| 久久综合亚洲色HEZYO社区| 青青草原综合久久| 久久免费的精品国产V∧| 日韩电影久久久被窝网| 久久国产精品-久久精品| 久久久无码精品亚洲日韩京东传媒 | 精品国际久久久久999波多野| 久久久久国色AV免费看图片| 久久久久亚洲av无码专区喷水| 色综合久久天天综线观看| 一本一道久久精品综合| 久久久久亚洲Av无码专| 综合久久精品色|