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

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 崔佳星 閱讀(890) 評論(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>
            亚洲国产欧美一区| 91久久在线播放| 欧美中文字幕在线| 亚洲欧美日韩另类| 在线观看日韩精品| 亚洲国产日韩欧美在线动漫| 欧美成人一区二区三区| 一区二区三区精品| 午夜精品久久久久久久久| 国产一区二区三区网站| 欧美成人国产| 欧美日韩综合不卡| 久久久人成影片一区二区三区观看 | 亚洲国产精品嫩草影院| 亚洲激情在线观看| 国产精品成人观看视频国产奇米| 久久成人国产精品| 美国成人直播| 欧美一区二区三区视频在线| 久久视频在线免费观看| 亚洲在线播放| 久久精品国产视频| aⅴ色国产欧美| 欧美一级淫片aaaaaaa视频| 亚洲精品国产精品乱码不99按摩 | 香蕉精品999视频一区二区| 亚洲国产精品久久人人爱蜜臀 | 午夜精品一区二区在线观看| 亚洲国产成人一区| 亚洲图片在线| 亚洲精品一区二区网址| 欧美伊人久久| 亚洲一区二区免费| 免费久久99精品国产自在现线| 亚洲综合日韩在线| 欧美精品aa| 欧美成人精品高清在线播放| 国产欧美一区二区精品性| 亚洲欧洲日本一区二区三区| 国产综合久久| 亚洲综合二区| 亚洲伊人色欲综合网| 蘑菇福利视频一区播放| 久久久国产精品一区二区三区| 国产精品久久久久aaaa樱花| 亚洲电影在线播放| 亚洲高清在线观看| 久久中文精品| 女同性一区二区三区人了人一 | 国产精品网曝门| 亚洲精品日产精品乱码不卡| 亚洲国产视频一区二区| 久久人人97超碰精品888| 久久精品五月| 国产一区在线视频| 欧美一区二区三区四区夜夜大片 | 一区二区三区国产在线观看| 欧美大片第1页| 欧美高清一区| 亚洲卡通欧美制服中文| 欧美777四色影视在线| 欧美福利在线观看| 亚洲品质自拍| 欧美激情精品久久久久久免费印度 | 亚洲网站在线播放| 亚洲午夜av在线| 欧美亚日韩国产aⅴ精品中极品| 亚洲茄子视频| 亚洲一二三区视频在线观看| 国产精品国产三级国产aⅴ9色| 日韩系列欧美系列| 亚洲一区日韩在线| 国产日韩成人精品| 久久久久9999亚洲精品| 麻豆精品在线播放| 亚洲国产精品成人一区二区| 欧美激情小视频| aa级大片欧美| 久久精品国产久精国产爱| 一区二区三区在线看| 免费永久网站黄欧美| 亚洲美女电影在线| 午夜精品福利视频| 激情综合电影网| 欧美另类在线播放| 亚洲一级一区| 欧美寡妇偷汉性猛交| 一本色道久久88亚洲综合88| 国产精品私拍pans大尺度在线| 久久国产毛片| 日韩视频久久| 久久精品天堂| 一本色道久久综合亚洲精品不 | 美女在线一区二区| 一区二区日韩免费看| 久久久国产成人精品| 亚洲精品一区二区在线观看| 国产精品日韩欧美一区二区三区| 久久久91精品国产| 夜久久久久久| 欧美大成色www永久网站婷| 一本色道久久综合精品竹菊| 国产一区在线观看视频| 欧美日韩亚洲一区二| 久久久91精品国产| 亚洲午夜精品久久| 亚洲高清免费| 久久久久国产精品一区| 亚洲午夜女主播在线直播| 国内成人精品2018免费看| 欧美日韩国产区一| 蜜桃av一区二区在线观看| 亚洲欧美亚洲| 在线亚洲一区二区| 欧美激情视频给我| 久久精品亚洲精品| 亚洲特色特黄| 亚洲精品男同| 亚洲成人资源网| 国产欧美日韩精品a在线观看| 欧美日韩高清区| 久久躁日日躁aaaaxxxx| 午夜精品国产精品大乳美女| 99精品久久免费看蜜臀剧情介绍| 欧美成人三级在线| 久久久欧美一区二区| 欧美一区二区三区久久精品茉莉花| 亚洲伦理中文字幕| 亚洲电影视频在线| 国产综合精品| 国产在线精品自拍| 国产亚洲欧美一区二区| 国产精品一区二区久久| 欧美性猛交xxxx免费看久久久| 欧美精品久久久久久久| 蘑菇福利视频一区播放| 美日韩精品视频| 老司机免费视频久久| 老司机精品视频网站| 美女免费视频一区| 欧美大片91| 欧美剧在线观看| 欧美日韩黄视频| 国产精品成人aaaaa网站| 欧美三区在线视频| 国产精品久久久久久久久久ktv | 久久久噜噜噜久噜久久| 久久精品国产v日韩v亚洲 | 免费不卡在线观看| 欧美大片一区二区| 欧美日韩视频专区在线播放 | 亚洲高清不卡av| 亚洲国产另类精品专区| 亚洲精选在线| 亚洲在线免费| 欧美一站二站| 开心色5月久久精品| 欧美激情第9页| 亚洲国内自拍| 亚洲一区尤物| 久久偷窥视频| 欧美另类高清视频在线| 国产精品入口日韩视频大尺度| 国产精品一级在线| 精品不卡一区二区三区| 日韩性生活视频| 性欧美办公室18xxxxhd| 免费高清在线一区| 日韩视频一区二区三区在线播放| 亚洲一区二区三区中文字幕| 久久久久高清| 欧美日本一区| 狠狠色丁香久久婷婷综合_中| 亚洲黄色免费网站| 先锋影音网一区二区| 欧美大片在线观看| 中文精品99久久国产香蕉| 久久精品一区二区三区不卡| 欧美久久一区| 国产一区二区三区在线观看免费 | 99亚洲精品| 久久久久久久999精品视频| 亚洲黄色三级| 欧美亚洲一区二区在线| 欧美日韩国产色综合一二三四 | 在线观看国产精品淫| 亚洲小说欧美另类婷婷| 久久影视三级福利片| 亚洲美女在线观看| 久久久噜噜噜久久久| 国产精品国产三级国产aⅴ浪潮| 精品不卡在线| 欧美一区二区三区成人| 亚洲黄色高清| 久久久噜噜噜久久久| 国产日韩欧美夫妻视频在线观看| 999亚洲国产精| 亚洲电影激情视频网站| 欧美自拍偷拍午夜视频| 国产精品久久久久久久久久三级 |