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

posts - 21,  comments - 9,  trackbacks - 0

回溯法:八皇后問題,一個(gè)經(jīng)典問題

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

 

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

遞歸解八皇后問題
/*遞歸法解八皇后問題*/
/*作者黃國瑜,《數(shù)據(jù)結(jié)構(gòu)(C語言版)》清華大學(xué)出版社*/
char Chessboard[8][8]; /*聲明8*8的空白棋盤*/
int N_Queens(int LocX, int LocY, int Queens) /*遞歸*/
{
int i,j;
int Result=0;
if(Queens == 8)/*遞歸結(jié)束條件*/
   return 1;
else if(QueenPlace(LocX,LocY))/*遞歸執(zhí)行部分*/
  {
  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) /*判斷傳入坐標(biāo)本身及入八個(gè)方向上是否有皇后*/
{
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();
}
/*********************************************************
*****************八皇后問題*******************************
************根據(jù)嚴(yán)書給的類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 一定要設(shè)為內(nèi)部變量*/
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; /*對(duì)角*/
while((p>=0)&&(q>=0))
{
  if(a[p][q]==1)
  {
   bslash=0;
   break;
  }
  p--;
  q--;
}      /*斜對(duì)角*/
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 崔佳星 閱讀(891) 評(píng)論(0)  編輯 收藏 引用

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


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

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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热一| 欧美激情一区在线| 亚洲欧美国产精品va在线观看| 亚洲系列中文字幕| 国产一区二区视频在线观看| 美日韩丰满少妇在线观看| 美女黄毛**国产精品啪啪| 亚洲电影一级黄| 亚洲精品小视频在线观看| 国产精品男女猛烈高潮激情| 久久九九免费视频| 免费观看久久久4p| 亚洲欧美日韩国产成人精品影院| 亚洲欧美国产制服动漫| 亚洲成色www8888| 日韩一区二区精品在线观看| 国产欧美日韩免费看aⅴ视频| 久久久一二三| 欧美日韩亚洲另类| 久久亚洲一区二区| 欧美日韩日本网| 久久天天躁狠狠躁夜夜av| 欧美国产综合视频| 欧美一区二区三区免费在线看| 久久久欧美一区二区| 一区二区日韩欧美| 久久久国产一区二区| 亚洲一二三四区| 久久综合久久综合久久综合| 午夜精品理论片| 久久综合色影院| 欧美专区在线观看| 欧美日韩精品系列| 欧美顶级大胆免费视频| 国产伦精品一区二区三区免费| 亚洲国产精品第一区二区三区| 国产欧美日韩一区二区三区| 亚洲另类在线一区| 最近中文字幕mv在线一区二区三区四区| 亚洲一区欧美激情| 亚洲视频在线观看视频| 欧美成人精品h版在线观看| 久久九九免费视频| 国产精品视频久久| 日韩一级免费| 99热在这里有精品免费| 卡一卡二国产精品| 久久天天躁狠狠躁夜夜av| 国产精品日日做人人爱| 99视频一区| 亚洲私人影院在线观看| 欧美激情按摩在线| 欧美国产一区二区在线观看| 韩国三级电影一区二区| 午夜精品久久久久久99热软件| 亚洲一区制服诱惑| 欧美日韩在线三级| 一本综合精品| 午夜影视日本亚洲欧洲精品| 欧美午夜精品一区| 夜夜嗨av一区二区三区网站四季av | 一区二区三区精品国产| 99re8这里有精品热视频免费| 欧美成人国产一区二区| 欧美福利专区| 亚洲精品日日夜夜| 欧美精品激情| 一区二区三区国产| 亚洲综合清纯丝袜自拍| 国产精品系列在线播放| 香蕉免费一区二区三区在线观看 | 国产视频一区三区| 欧美亚洲免费在线| 美女成人午夜| 亚洲日本中文字幕免费在线不卡| 免费欧美日韩| 亚洲欧洲日本在线| 亚洲视频狠狠| 国产欧美va欧美不卡在线| 欧美一区午夜精品| 欧美成人高清| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩成人网| 亚洲欧美日韩国产中文在线| 久久婷婷综合激情| 亚洲人体1000| 国产精品伦理| 久久视频在线看| 亚洲精品一级| 久久精品首页| 99国产精品久久久久久久成人热| 欧美午夜久久久| 久久人人97超碰精品888| 91久久久久久国产精品| 欧美一级片在线播放| 在线日韩欧美| 国产精品久久久一区麻豆最新章节| 久久av一区二区三区| 亚洲国产精品一区二区久| 午夜精品福利视频| 亚洲国产精品欧美一二99| 欧美性猛交一区二区三区精品| 欧美一区二区三区视频在线| 亚洲激情国产| 久久婷婷蜜乳一本欲蜜臀| 亚洲性xxxx| 亚洲国产精品成人综合色在线婷婷 | 亚洲无玛一区| 亚洲第一精品电影| 欧美一二三视频| 999在线观看精品免费不卡网站| 国产日产欧美精品| 欧美日韩一区二区三| 久久深夜福利| 久久国产直播| 亚洲香蕉视频| 日韩亚洲在线观看| 亚洲国产日韩一级| 美女免费视频一区| 久久精品欧洲| 性刺激综合网| 午夜精品福利在线| 亚洲网站在线看| 日韩午夜在线电影| 91久久精品国产91久久| 伊人春色精品| 极品少妇一区二区三区精品视频| 国产精品嫩草久久久久| 欧美午夜激情在线| 欧美日韩一区二区视频在线观看| 欧美不卡一区| 欧美成熟视频| 欧美久久在线| 欧美精品大片| 欧美日韩美女在线观看| 欧美精品一区二区三区高清aⅴ| 欧美freesex交免费视频| 久久香蕉精品| 免费欧美高清视频| 欧美成熟视频| 欧美人与禽猛交乱配视频| 欧美激情乱人伦| 欧美理论电影在线播放| 欧美日本韩国一区| 欧美日韩一区在线观看视频| 欧美色网一区二区| 国产精品成人av性教育| 国产精品麻豆欧美日韩ww| 国产精品欧美日韩久久| 国产九九视频一区二区三区| 国产日韩一区二区三区在线播放| 国产视频自拍一区| 亚洲第一网站| av成人动漫| 欧美一级专区免费大片| 久久一区二区三区四区五区| 欧美电影打屁股sp| 亚洲免费播放| 欧美一级欧美一级在线播放| 欧美与欧洲交xxxx免费观看| 久久影视精品| 欧美日韩精品三区| 国产欧美精品va在线观看| 国内欧美视频一区二区| 亚洲电影免费在线| 亚洲图片欧美一区| 久久久另类综合| 亚洲二区在线观看| 宅男噜噜噜66一区二区| 欧美在线视频二区| 欧美激情1区2区3区| 国产精品夜色7777狼人| 亚洲成人自拍视频| 亚洲欧洲av一区二区| 麻豆精品国产91久久久久久| 亚洲精选一区| 欧美在线免费观看视频| 欧美精选午夜久久久乱码6080| 国产女人水真多18毛片18精品视频| 在线观看不卡av| 亚洲欧美乱综合| 欧美激情亚洲综合一区| 亚洲欧美综合一区| 欧美激情精品久久久| 国产一区二区黄| 亚洲天堂男人| 亚洲国产第一| 久久久久久亚洲精品不卡4k岛国| 欧美日韩国内| 亚洲国产专区校园欧美| 欧美在线短视频| 99re66热这里只有精品3直播| 久久久久一区二区三区四区| 国产精品久久久久久久电影| 亚洲人午夜精品免费| 久久综合激情|