青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 21,  comments - 9,  trackbacks - 0

回溯法:八皇后問題,一個經典問題

     在程序設計中還有一種方法叫做"回溯法".他不是按照某種公式或確定的法則,求問題的解,而是通過試探和糾正錯誤的策略,找到問題的街.這種方法一般是從一個原始狀態出發,通過若干步試探,最后達到目標狀態終止.
    回溯法在理論上來說,就是在一棵搜索樹中從根結點出發,找到一條達到滿足某條件的子結點的路徑.在搜索過程中,對于每一個中間結點,他的位置以及向下搜索過程是相似的,因此完全可以用遞歸來處理.典型的例子就是著名的"八皇后問題".
    "八皇后問題"是在國際象棋棋盤上放置八個皇后,使她們不能相吃.國際象棋中的皇后可以吃掉與她處于同一行,同一列,同一對角線上的棋子.因此每一行只能擺放一個皇后.因共有八行,所以每行有且只有一個皇后.
    在本例中皇后的位置有一個一維數組來存放A(I)=J表示第I行皇后放在第J列.下面主要來看看怎么樣判斷皇后是否安全的問題.(1)首先,用一維數組來表示,已經解決了不在同一行的問題.(2)對于列可以引進一個標志數組C[J],若J列上已放了皇后,則C[J]=FALSE.(3)對于左上右下的對角線I-J為一常量,位于[-7,+7]之間,再此引入標志數組L[-7..7];對于左下右上的對角線,類似的有I+J等于常量,用數組R[2..16]來表示.當在第I行,第J列上放置了皇后,則只需設置:C[J]:=FALSE; L[I-J]:=FLASE; R[I+J]:=FALSE就可以解決皇后的安全問題了.

 

問題描述:在標準國際象棋的棋盤上(8*8格)準備放置8只皇后,我們知道,國際象棋中皇后的威力是最大的,她既可以橫走豎走,還可以斜著走,遇到擋在她前進路線上的敵人,她就可以吃掉對手。要求在棋盤上安放8只皇后,使她們彼此互相都不能吃到對方,求皇后的放法。
/************************************************************************/
/*                                   */
/*    問題:在8×8的國際象棋棋盤上放置8個皇后,要求任意兩個皇后       */
/*       不能在同一行、同一列或同一條對角線上。             */
/*                                   */
/*    本程序使用遞歸-回溯法求解8皇后問題。Visual C++ 6.0 調試通過。  */
/*    作者 晨星     2002年5月9日                   */
/*                                   */
/************************************************************************/
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define QUEENS 8
//!記錄解的序號的全局變量。
int iCount = 0;
//!記錄皇后在各列上的放置位置的全局數組。
int Site[QUEENS];
//!遞歸求解的函數。
void Queen(int n);
//!輸出一個解。
void Output();
//!判斷第n個皇后放上去之后,是否有沖突。
int IsValid(int n);
/*----------------------------Main:主函數。 ----------------------------*/
void main()
{
     //!從第0列開始遞歸試探。
     Queen(0);
     //!按任意鍵返回。
     getch();
}
/*-----------------Queen:遞歸放置第n個皇后,程序的核心!----------------*/
void Queen(int n)
{
     int i;
     //!參數n從0開始,等于8時便試出了一個解,將它輸出并回溯。
     if(n == QUEENS)
     {
           Output();
           return;
     }
      
     //!n還沒到8,在第n列的各個行上依次試探。
     for(i = 1 ; i <= QUEENS ; i++)
     {
           //!在該列的第i行上放置皇后。
           Site[n] = i;
           //!如果放置沒有沖突,就開始下一列的試探。
           if(IsValid(n))
                 Queen(n + 1);
     }
}
/*------IsValid:判斷第n個皇后放上去之后,是否合法,即是否無沖突。------*/
int IsValid(int n)
{
     int i;
     //!將第n個皇后的位置依次于前面n-1個皇后的位置比較。
     for(i = 0 ; i < n ; i++)
     {
           //!兩個皇后在同一行上,返回0。
           if(Site[i] == Site[n])
                 return 0;
           //!兩個皇后在同一對角線上,返回0。
           if(abs(Site[i] - Site[n]) == (n - i))
                 return 0;
     }
     //!沒有沖突,返回1。
     return 1;
}
/*------------Output:輸出一個解,即一種沒有沖突的放置方案。------------*/
void Output()
{
     int i;
     //!輸出序號。
     printf("No.%-5d" , ++iCount);
     //!依次輸出各個列上的皇后的位置,即所在的行數。
     for(i = 0 ; i < QUEENS ; i++)
           printf("%d " , Site[i]);
     printf("n");
}


STL源代碼
用了STL, 方法是一樣的.
#include <iostream>
#include <string>
using namespace std;
void queen(const string t, const string s)
{
    if (s=="") cout<<t<<endl;
    else
        for (int i=0; i<s.length(); i++) {
            bool safe=true;
            for (int j=0;j<t.length();j++) {
                if (t.length()-j==abs(s[i]-t[j])) safe=false;
            }
            if (safe) queen(t+s[i], s.substr(0,i)+s.substr(i+1));
    }
}
int main()
{
            string s="01234567";
    queen("",s);
    system("PAUSE");
    exit(EXIT_SUCCESS);
}

遞歸解八皇后問題
/*遞歸法解八皇后問題*/
/*作者黃國瑜,《數據結構(C語言版)》清華大學出版社*/
char Chessboard[8][8]; /*聲明8*8的空白棋盤*/
int N_Queens(int LocX, int LocY, int Queens) /*遞歸*/
{
int i,j;
int Result=0;
if(Queens == 8)/*遞歸結束條件*/
   return 1;
else if(QueenPlace(LocX,LocY))/*遞歸執行部分*/
  {
  Chessboard[LocX][LocY] = 'Q';
  for(i=0;i<8;i++)
    for(j=0;j<8;j++)
    {
    Result += N_Queens(i,j,Queens+1);
    if(Result>0)
      break;
    }
  if(Result>0)
    return 1;
  else
    {
    Chessboard[LocX][LocY] = 'X';
    }
  }
else
  return 0;
}
int QueenPlace(int LocX,int LocY) /*判斷傳入坐標本身及入八個方向上是否有皇后*/
{
int i,j;
if(Chessboard[LocX][LocY] != 'X')
  return 0;
for(j=LocY-1;j>=0;j--)
  if(Chessboard[LocX][j] != 'X')
    return 0;
for(j=LocY+1;j<8;j++)
  if(Chessboard[LocX][j] != 'X')
    return 0;
for(i=LocX-1;i>=0;i--)
  if(Chessboard[i][LocY] != 'X')
    return 0;
for(i=LocX+1;i<8;i++)
  if(Chessboard[i][LocY] != 'X')
    return 0;
i= LocX - 1;
j= LocY - 1;
while (i>=0&&j>=0)
  if(Chessboard[i--][j--] != 'X')
    return 0;
i= LocX + 1;
j= LocY - 1;
while (i<8&&j>=0)
  if(Chessboard[i++][j--] != 'X')
    return 0;
i= LocX - 1;
j= LocY + 1;
while (i>=0&&j<8)
  if(Chessboard[i--][j++] != 'X')
    return 0;
i= LocX + 1;
j= LocY + 1;
while (i<8&&j<8)
  if(Chessboard[i++][j--] != 'X')
    return 0;
return 1;
}
main() /*主程序*/
{
int i,j;
for(i=0;i<8;i++)
  for(j=0;j<8;j++)
    Chessboard[i][j] = 'X';
N_Queens(0,0,0);
printf("the graph of 8 Queens on the Chessboard.is:n");
for(i=0;i<8;i++)
  for(j=0;j<8;j++)
  {
  if(Chessboard[i][j] == 'Q')
    printf("(%d,%d)n",i,j);
  }
getch();
}
/*********************************************************
*****************八皇后問題*******************************
************根據嚴書給的類c算法求得************************
*********************************************************/
#include<stdio.h>
#define N 8
int col=1,row=1,slash=1,bslash=1;
int a[N][N];
int p,q,k,l;
int num=0;
void trial(int i)
{
int j;   /*注 意,這里的j 一定要設為內部變量*/
if(i==N)
{
num++;
for(k=0;k<N;k++)
{
for(l=0;l<N;l++)
{
  if(a[k][l]==1)
   printf("@");
  else printf("*");
}
printf("n");
}
printf("nn");
getchar();
}
else
{
for(j=0;j<N;j++)
{
for(k=0;k<i;k++)
  if(a[k][j]==1)
  {
   col=0;
   break;
  }     /*列*/
p=i-1;
q=j+1;
while((p>=0)&&(q<N))
{
  if(a[p][q]==1)
  {
   slash=0;
   break;
  }
  p--;
  q++;
}
p=i-1;
q=j-1; /*對角*/
while((p>=0)&&(q>=0))
{
  if(a[p][q]==1)
  {
   bslash=0;
   break;
  }
  p--;
  q--;
}      /*斜對角*/
if((col==1)&&(slash==1)&&(bslash==1)) /*條件判斷*/
{
  a[i][j]=1;
  trial(i+1);
}
col=1;slash=1;bslash=1;
a[i][j]=0;
}
}
}
void main()
{
trial(0);
printf("%dn",num);
getchar();
}

posted on 2010-08-20 18:34 崔佳星 閱讀(889) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久免费视频一区| 国产一区二区三区在线观看精品 | 欧美天堂亚洲电影院在线观看 | 国产精品网站一区| 亚洲欧美99| 亚洲欧美日韩精品久久亚洲区 | 亚洲深夜福利网站| 国产精品久久久久免费a∨大胸| 亚洲视频在线观看| 亚洲午夜精品一区二区三区他趣| 国产精品久久久久久久浪潮网站 | 亚洲精品国精品久久99热一| 亚洲二区免费| 欧美—级高清免费播放| 宅男噜噜噜66一区二区| 亚洲欧美不卡| 亚洲精品小视频在线观看| 亚洲一区二区免费看| 亚洲精选久久| 蜜桃精品一区二区三区 | 亚洲国产精品毛片| 国产欧美日韩三区| 亚洲精品国精品久久99热一| 国内成+人亚洲+欧美+综合在线| 91久久综合| 亚洲成人自拍视频| 久久精品国产精品亚洲| 香蕉国产精品偷在线观看不卡| 亚洲欧美成人| 在线成人中文字幕| 亚洲免费视频成人| 久久久久久香蕉网| 亚洲一区二区日本| 久久亚洲春色中文字幕| 99精品欧美一区| 久久久99久久精品女同性| 日韩亚洲在线| 久久网站免费| 久久综合电影一区| 国产精品一区二区男女羞羞无遮挡| 麻豆成人综合网| 国产亚洲精品激情久久| 99精品久久久| 一区二区自拍| 小嫩嫩精品导航| 久久av一区二区三区漫画| 欧美成人dvd在线视频| 久久综合久久综合这里只有精品| 欧美日韩一区在线观看视频| 欧美成人免费全部观看天天性色| 国产伦精品一区| 欧美有码视频| 欧美在线一区二区| 国精品一区二区| 久久激情中文| 欧美激情视频一区二区三区在线播放 | 亚洲成人在线视频网站| 在线色欧美三级视频| 欧美专区18| 国产毛片久久| 久久久综合网站| 亚洲国产精品久久久久秋霞影院| 亚洲精品永久免费| 国产精品蜜臀在线观看| 亚洲综合视频一区| 欧美电影在线观看完整版| 亚洲精品在线二区| 国产女人精品视频| 麻豆精品91| 午夜精品久久久久久久99水蜜桃| 老司机aⅴ在线精品导航| 在线视频亚洲一区| 在线精品国精品国产尤物884a| 欧美激情一区二区三区不卡| 亚洲伊人一本大道中文字幕| 久久中文字幕一区二区三区| 亚洲视频1区| 曰韩精品一区二区| 国产精品久久久久一区二区| 久久字幕精品一区| 午夜免费日韩视频| 中国女人久久久| 亚洲激情av在线| 欧美aaa级| 狂野欧美激情性xxxx| 午夜在线不卡| 亚洲欧美另类国产| 亚洲在线黄色| 欧美亚洲一区二区三区| 亚洲一区二区三区在线观看视频 | 亚洲福利视频网站| 久久深夜福利免费观看| 久久狠狠一本精品综合网| 午夜久久久久久久久久一区二区| 亚洲天天影视| 国产精品入口麻豆原神| 久久久精品2019中文字幕神马| 欧美 日韩 国产一区二区在线视频 | 亚洲精品日本| 伊甸园精品99久久久久久| 韩曰欧美视频免费观看| 亚洲日本欧美| 午夜精品在线视频| 亚洲国产另类久久久精品极度| 亚洲女女做受ⅹxx高潮| 久久一本综合频道| 免费视频一区二区三区在线观看| 久久久水蜜桃av免费网站| 久久综合图片| 欧美日韩中文字幕在线视频| 国产精品久久91| 欧美精品免费在线观看| 欧美国产免费| 国产九色精品成人porny| 国内精品一区二区| 性视频1819p久久| 国产精品h在线观看| 一本色道久久综合亚洲精品按摩 | 欧美日韩91| 国产亚洲欧美一级| 一卡二卡3卡四卡高清精品视频| 久久免费黄色| 99视频有精品| 欧美午夜精品一区二区三区| 亚洲国产网站| 欧美在线免费观看亚洲| 亚洲成人原创| 欧美激情免费在线| 亚洲一级二级在线| 欧美日韩精品不卡| 国产一区在线免费观看| 欧美一区二区三区成人| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲美女淫视频| 久久国产免费看| 欧美精品一区二区三区蜜桃 | 亚洲国产精品一区在线观看不卡| 亚洲黄色一区| 欧美精品亚洲| 午夜久久黄色| 欧美第十八页| 亚洲精品网址在线观看| 亚洲一区二区欧美| 激情亚洲成人| 欧美亚洲在线观看| 亚洲视频久久| 欧美天天影院| 亚洲精品视频啊美女在线直播| 在线高清一区| 久久精彩视频| 欧美二区在线播放| 在线精品高清中文字幕| 另类激情亚洲| 亚洲福利久久| 亚洲人www| 欧美亚一区二区| 午夜在线电影亚洲一区| 欧美自拍偷拍午夜视频| 国产精品永久免费| 久久精品伊人| 亚洲夫妻自拍| 亚洲欧美成aⅴ人在线观看| 国产亚洲一区二区三区| 欧美岛国激情| 午夜精品久久久久久久99热浪潮 | 91久久中文| 老司机免费视频一区二区| 亚洲国产日韩精品| 欧美日韩在线视频一区二区| 中文在线资源观看网站视频免费不卡| 99精品久久| 国产欧美日韩亚洲精品| 美日韩精品免费| 亚洲欧美日韩精品久久久久| 久久免费视频在线| 最新国产の精品合集bt伙计| 欧美日韩视频在线一区二区| 欧美亚洲三区| 9色porny自拍视频一区二区| 久久精品123| 亚洲综合不卡| 亚洲人精品午夜| 国产一区二区三区免费在线观看| 免费久久99精品国产自在现线 | 欧美不卡高清| 久久精品一区二区三区中文字幕| 日韩特黄影片| 精品999日本| 激情久久一区| 精品不卡视频| 在线观看中文字幕不卡| 国产一区二区三区高清| 欧美视频中文字幕| 欧美午夜欧美| 欧美日韩国产成人精品| 欧美理论视频| 国产日韩一级二级三级| 国产一区二区三区四区hd| 亚洲激情一区二区| 亚洲一二三四久久|