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

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 崔佳星 閱讀(899) 評論(0)  編輯 收藏 引用

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


<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(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久久一区二区| 亚洲国产精品女人久久久| 亚洲视频在线看| 欧美日韩综合另类| 亚洲欧美久久久| 亚洲天堂久久| 国产一区二区三区在线播放免费观看| 欧美影院视频| 久久精品国产精品亚洲精品| 在线观看一区| 亚洲美女视频在线免费观看| 国产精品私房写真福利视频| 欧美一级淫片播放口| 欧美一区二区免费| 亚洲国产mv| 一区二区三区精密机械公司| 国产欧美一区二区三区在线老狼| 久久久成人精品| 欧美激情综合五月色丁香| 亚洲一区二区三区在线播放| 欧美一区二区三区视频在线观看| 在线不卡视频| 99精品热视频| 激情成人综合网| 99在线精品视频在线观看| 国产情侣久久| 亚洲日本免费| 韩国v欧美v日本v亚洲v| 91久久久国产精品| 国产亚洲成av人在线观看导航 | 国产欧美日韩综合一区在线播放| 久久久久综合网| 欧美日韩成人免费| 久久国产毛片| 欧美三级免费| 欧美成人综合一区| 国产欧美一区二区三区在线老狼| 欧美国产第二页| 国产欧美精品日韩| 亚洲精品免费观看| 1024精品一区二区三区| 亚洲一区二区三区777| 亚洲国产一区二区三区在线播| 亚洲一区在线直播| 在线中文字幕不卡| 久久亚洲精品一区二区| 欧美一级大片在线观看| 欧美日韩成人在线播放| 女主播福利一区| 国产一区二区成人| 中国女人久久久| 亚洲免费久久| 欧美激情小视频| 欧美激情一区二区三区高清视频| 国产一区三区三区| 亚洲一区二区视频在线| 亚洲午夜伦理| 欧美日韩亚洲另类| 亚洲激情成人| 最新中文字幕亚洲| 狂野欧美激情性xxxx| 久久天天躁夜夜躁狠狠躁2022| 国产欧美短视频| 亚洲图片在区色| 午夜精品一区二区三区电影天堂 | 欧美性大战久久久久| 亚洲国产三级| 一区二区三区精品| 欧美日韩国产一区精品一区| 亚洲美女在线观看| 亚洲一区二区三区三| 欧美日韩国产电影| 夜夜嗨av一区二区三区网站四季av| 亚洲精品视频免费在线观看| 欧美成人久久| 91久久精品国产91久久性色| 亚洲精品免费网站| 欧美久久久久久久| 日韩午夜免费视频| 欧美亚洲一区在线| 国产一区二区久久久| 久久精品欧美日韩| 欧美大胆人体视频| 99伊人成综合| 国产精品视频一二| 性欧美在线看片a免费观看| 久久视频国产精品免费视频在线| 国产真实乱子伦精品视频| 久久精品国产久精国产一老狼 | 老司机午夜精品视频| 亚洲大片在线观看| 欧美激情一区二区在线| 99精品久久久| 久久久久久久性| 亚洲精品之草原avav久久| 欧美日韩国产成人在线免费 | 亚洲精品久久嫩草网站秘色 | 国产精品99久久久久久久久久久久 | 久久久久久久网站| 最新亚洲视频| 久久国产精品久久久| 亚洲国产成人精品视频| 欧美日韩伊人| 久久久久欧美精品| 日韩一级片网址| 久久久久久久波多野高潮日日| 亚洲精品乱码久久久久久黑人| 国产精品日韩一区二区| 久久综合九色| 亚洲午夜一级| 亚洲国产日韩欧美在线图片| 欧美一区二区久久久| 亚洲欧洲日产国产综合网| 国产精品日日摸夜夜添夜夜av| 女女同性精品视频| 亚洲欧美影音先锋| 日韩亚洲视频| 欧美黄色aa电影| 欧美专区福利在线| 亚洲性夜色噜噜噜7777| 亚洲精品免费在线播放| 国产亚洲精品福利| 国产精品久久久久久久久久免费看 | 久久精品国产99国产精品| 中国成人黄色视屏| 亚洲国产精品免费| 狠狠色狠狠色综合日日tαg | 欧美日韩精品免费观看视频完整| 午夜精品久久久久久久男人的天堂 | 亚洲校园激情| 亚洲最新合集| 亚洲黄色免费网站| 久久五月激情| 久久久综合网站| 欧美一区久久| 校园春色综合网| 亚洲欧美日韩一区| 亚洲最新合集| 99精品欧美一区| 一本大道久久a久久综合婷婷 | 在线日韩欧美视频| 国产又爽又黄的激情精品视频| 国产精品性做久久久久久| 欧美午夜精品久久久久久人妖| 欧美国产日韩视频| 欧美精品一区二区蜜臀亚洲| 老色批av在线精品| 蜜桃久久av| 牛人盗摄一区二区三区视频| 久久综合电影| 欧美成人资源网| 欧美激情一区二区三区不卡| 欧美精品一区二区三区高清aⅴ| 免费高清在线一区| 欧美激情小视频| 欧美日韩午夜激情| 欧美日韩一区在线播放| 欧美午夜无遮挡| 国产精品美女www爽爽爽视频| 国产精品视频一区二区三区| 国产无一区二区| 亚洲成人在线网| 亚洲美女在线视频| 亚洲深夜福利| 久久av一区二区| 免费观看在线综合| 亚洲激情视频网站| 亚洲一区二区三区四区在线观看| 亚洲一线二线三线久久久| 欧美一区二区三区日韩| 久久网站免费| 欧美日韩一区二区在线| 国产乱肥老妇国产一区二 | 国产一区二区三区在线观看精品 | 亚洲黄色成人久久久| 日韩视频免费观看| 亚洲综合日本| 免费观看日韩av| 欧美三级特黄| 一区二区三区亚洲| 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品swag| 狠狠色狠狠色综合系列| 日韩午夜免费| 久久久www成人免费毛片麻豆| 亚洲国产一区二区三区a毛片 | 欧美大片在线观看一区| 99在线精品视频| 久久综合伊人77777| 国产精品每日更新在线播放网址| 尤物视频一区二区| 亚洲综合99| 亚洲人成人一区二区三区| 欧美在线日韩在线| 欧美视频导航| 亚洲日韩视频| 久久中文字幕一区| 午夜精品福利视频| 欧美日韩国产综合网| 亚洲黄一区二区|