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

隨筆 - 70  文章 - 160  trackbacks - 0

公告:
知識共享許可協議
本博客采用知識共享署名 2.5 中國大陸許可協議進行許可。本博客版權歸作者所有,歡迎轉載,但未經作者同意不得隨機刪除文章任何內容,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 具體操作方式可參考此處。如您有任何疑問或者授權方面的協商,請給我留言。

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180080
  • 排名 - 147

最新評論

閱讀排行榜

評論排行榜

軟件課講了這些問題,這次順便總結下。

 說白了也就是:遞歸,回溯,深搜或者廣搜。 

 1.漢諾塔 

 ////////////////////////////////////////////////
/*
漢諾塔
題目:
假設有A, B, C 3個軸,有n個直徑各不相同,
從小到大依次編號為1,2,3,…,n的圓盤
按照從小到大的順序疊放在A軸上?,F在要求
將這n個圓盤移至C軸上并仍然按照同樣順序
疊放,但圓盤移動時必須遵守下列規則:
1.每次只能移動一個圓盤,它必須位于某個
  軸的頂部。
2.圓盤可以插在A,B,C中任一軸上。
3.任何時刻都不能將一個較大的圓盤壓在較小
  的圓盤之上。
*/
/////////////////////////////////////////////// 

經典的問題,屬于遞歸的入門級問題,但是同樣不好分析,在n<=4以內還可以模擬下漢諾塔的實現,當n>=5時就不太現實了,讓我們來看看漢諾塔當圓盤個數n時有多少組解? 按照傳說來看:n=64,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸于盡。 

 但是這畢竟是神話,不過當把64個金片全部放到另外一根針時,確實要很長很長一段時間。 
讓我們來看看需要多長時間。 
 首先,我們找出遞推關系: 
 f(n + 1) = 2*f(n) + 1 
 至于這個怎么得到的可以畫圖看看。 
 把遞推關系算出來后,也就是: 
 f(n) = 2^n-1 
 那么當n=64時,是多少? 
 f(64)= 2^64-1=18446744073709551615   
假如每秒鐘一次,共需多長時間呢?一年大約有 31536926 秒,計算表明移完這些金片需要5800多億年,比地球壽命還要長,事實上,世界、梵塔、廟宇和眾生都已經灰飛煙滅。 

好吧,說了那么多,還是步入正題。
漢諾塔的實現有遞歸和非遞歸兩種情況,遞歸的很常見,也很簡單,非遞歸實際上就是二叉樹的中序遍歷。也可以認為是棧的實現。
遞歸的版本:
/*遞歸實現*/
#include 
<iostream>
using namespace std;
 
//把n號圓盤從x移到y,并打印出。
void Move(int n, char x, char y)
{
  cout
<< "" << n << "號圓盤從" << x << "移動到" << y << endl;
}
 
//把前n個通過b從a移到c
void Hanoi(int n, char a, char b, char c)  
{
    
if(n == 1)
        Move(
1, a, c);
    
else
    {
        Hanoi(n
-1, a, c, b);
        Move(n, a, c);
        Hanoi(n
-1, b, a, c);
    }
}
 
int main()
{
    
int n;
    cout 
<< "輸入n的大小: ";
    cin 
>> n;
    Hanoi(n, 
'a''b''c');
    cout 
<< "Ok!" << endl << "By Tanky Woo." << endl;
    
return 0;
}

非遞歸的版本有時間再補上。


2.n皇后
對于每一個ACMer,八皇后問題都是必經之路。

 作為搜索類題目還是老問題: 

 1.邊界條件。 
 2.對每種情況都得遍歷到,可以用解答樹分析。 
 3.剪枝 http://www.wutianqi.com/?p=1341(搜索與剪枝)
 4.輔助空間的變化。回溯前和回溯后的變化。 
 如果不用輔助空間的回溯當然就不需要注意輔助空間的問題了。 

以下是n皇后的源碼: 

/*
*  n皇后問題
*  Tanky Woo
*/
 
#include 
<iostream>
using namespace std;
 
int queen[100];
int n;         // n皇后
int tot = 0;   //解法種數
 
// www.wutianqi.com
void search(int cur)
{
    
if(cur == n)   //遞歸邊界。符合要求,輸出。
    {
        tot
++;
        
for(int i=0; i<n; ++i)
            cout 
<< queen[i] << " ";
        cout 
<< endl;
    }
    
else
    {
        
for(int i=0; i<n; ++i)
        {
            
bool flag = 1;
            queen[cur] 
= i;    // 嘗試把第cur行的皇后放在第i列
            for(int j=0; j<cur; ++j)    // 檢查是否和前面的皇后沖突
                if(queen[cur] == queen[j]        // 同一列
                || cur-queen[cur] == j-queen[j]    // 正對角線
                || cur+queen[cur] == j+queen[j])   // 反對角線
                {
                    flag 
= 0;
                    
break;
                }
            
if(flag)
                search(cur
+1);    // 如果合法,繼續
        }
    }
}
 
int main()
{
    cout 
<< "輸入皇后個數n: ";
    cin 
>> n;
    search(
0);
    cout 
<< "共有" << tot << "種解." << endl << "By Tanky Woo." << endl;
    
return 0;
}

對于這個問題,還可以用輔助空間來提高算法的效率: 增加輔助空間vis[][]來判斷是否有其他皇后已經在列和對角線上。 
#include <iostream>
using namespace std;
 
int queen[100];
int n;         // n皇后
int tot = 0;   //解法種數
 
 
int vis[3][100];   // 輔助空間
void search(int cur)
{
    
if(cur == n)   //遞歸邊界。符合要求,輸出。
    {
        tot
++;
        
for(int i=0; i<n; ++i)
            cout 
<< queen[i] << " ";
        cout 
<< endl;
    }
    
else
    {
        
for(int i=0; i<n; ++i)
        {
            
if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n])
            {
                queen[cur] 
= i;
                vis[
0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 1;
                search(cur
+1);
                vis[
0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0;  //記住要變化來
            }
        }
    }
}
 
 
int main()
{
    memset(vis, 
0sizeof(vis));
    cout 
<< "輸入皇后個數n: ";
    cin 
>> n;
    search(
0);
    cout 
<< "共有" << tot << "種解." << endl << "By Tanky Woo." << endl;
    
return 0;
}


3.跳馬問題: 
據說此題證明可以用組合數學中的哈密頓環。
組合數學確實博大精深,看過一段時間的組合數學,感覺和實際聯系的很多,Orz.
此題有兩種版本: 

 ①:給定一個N*N的棋盤,起始點在(0,0)處,要求求出有多少種方法,可以不重復的遍歷棋盤上所有的點。 
   規則:1.馬走日字
           2.走過的點就不能再走了 

 此題和上面的n皇后類似,是標準的DFS。 
分析:從起始點開始,每次遍歷八種方向,直到邊界條件,并輸出。 

以下是跳馬問題一的源碼:

/*馬跳棋盤問題*/
 
#include 
<iostream>
using namespace std;
const int N = 10;
int a[N][N] = {0};
int cnt = 0;
 
void Horse(int a, int b, int t);
// www.wutianqi.com
int main()
{
    
int i = 0, j = 0, t = 1;
    a[i][j] 
= t;
    Horse(i, j, step
+1);
    cout 
<< cnt << endl;
    cout 
<< "By Tanky Woo.\n";
    
return 0;
}
void Horse(int a, int b, int t)
{

    int x[4={-2-112}, y[4= {-2-112};  
    
if(t == N*N+1)  
        cnt
++;
 
    
for(int i=0; i<4++i)
        
for(int j=0; j<4++j)
        {
            
if(x[i]==y[j] || x[i]==-y[j])  
                continue;
            
if(a+x[i]>=0 && a+x[i]<&& b+y[j]>=0 && b+y[j]<&& board[a+x[i]][b+y[j]]==0)
            {
                a[a
+x[i]][b+y[j]] = t;
                Horse(a
+x[i], b+y[j], t+1);
                a[a
+x[i]][b+y[j]] = 0;
            }
        }
}
 


第二個版本: ②:設有右圖所示的一個棋盤,在棋盤上的A點,有一個中國象棋的馬,并約定馬走的規則:
規則:1. 馬走日字
        2. 馬只能向右走。
試找出所有從A到B的途徑。 
  

此題也是OI上很有名的騎士問題。
此題似乎比較適合BFS. 
還沒嘗試過。 
 


 
讓我再想想,好像還有八數碼和素數環問題沒寫。
不過在HDOJ上遇到過一個素數環的題目:
http://www.wutianqi.com/?p=1329
有興趣可以做下。

對于DFS和BFS更多的題目,可以在我博客右上角搜索欄里輸入DFS或BFS,會出來相應題目。  

posted on 2010-09-30 15:24 Tanky Woo 閱讀(2544) 評論(2)  編輯 收藏 引用

FeedBack:
# re: 漢諾塔,n皇后,跳馬問題匯總 2010-10-07 12:24 popeer
hanoi的遞歸實現越搬號大的圓盤,越是費時間。

我用程序試過了,從是把1,2,3,4這樣的小號翻來覆去的搬家,遞歸真苦惱。  回復  更多評論
  
# re: 漢諾塔,n皇后,跳馬問題匯總[未登錄] 2010-10-07 12:49 Tanky Woo
@popeer
對。嚴蔚敏的《數據結構》上好像有對n=4的模擬,似乎要10多步還是20步。反正挺多的。
當n>=5基本就很難模擬了,中間出錯一步全部就白費了。

遞歸這種東西找的是相對關系,不要多想,否則會越想越糊涂。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲国产美女| 国产日韩精品一区二区三区| 黄色av成人| 欧美成人四级电影| 欧美黄在线观看| 亚洲免费伊人电影在线观看av| 夜夜嗨av一区二区三区四季av| 国产精品一区二区久激情瑜伽| 亚洲欧美一区二区三区久久 | 亚洲午夜免费福利视频| 在线亚洲一区二区| 国精品一区二区| 欧美激情在线| 国产视频久久网| 亚洲高清自拍| 欧美性做爰猛烈叫床潮| 久久久欧美精品| 欧美日韩一级黄| 久久综合色8888| 国产精品久久午夜夜伦鲁鲁| 蜜桃久久av一区| 国产精品亚洲а∨天堂免在线| 免费不卡在线视频| 欧美午夜影院| 亚洲国产精品传媒在线观看| 国产精品久久久久久久久久久久 | 欧美日韩1234| 久久久视频精品| 国产精品高清一区二区三区| 欧美a级一区| 国产性天天综合网| 99re这里只有精品6| 狠狠色丁香久久综合频道 | 亚洲国产视频一区| 国内一区二区三区| 亚洲午夜精品一区二区| 亚洲精品国精品久久99热| 欧美亚洲尤物久久| 亚洲欧美日韩一区二区| 美女网站久久| 亚洲午夜激情| 亚洲成色777777在线观看影院| 亚洲视频免费观看| 一本一本久久a久久精品牛牛影视| 久久精品中文字幕一区| 香蕉乱码成人久久天堂爱免费| 欧美高清视频在线| 欧美高清在线精品一区| 国产主播一区| 欧美在线电影| 久久精品99久久香蕉国产色戒| 国产精品乱人伦一区二区| 亚洲国产日韩综合一区| 亚洲第一福利社区| 久久人人爽人人爽爽久久| 久久久久久久一区| 国产欧美视频一区二区三区| 亚洲性视频网址| 午夜精品成人在线视频| 欧美午夜精品久久久久久人妖| 亚洲乱码国产乱码精品精天堂| 亚洲美女av电影| 欧美日韩不卡| 一区二区高清| 亚洲一区二区三区免费观看| 欧美日韩精品一区二区三区| 99re热精品| 欧美在线免费| 精品999成人| 另类欧美日韩国产在线| 欧美国产日韩视频| 夜夜爽www精品| 欧美视频四区| 欧美一区二区视频网站| 久久久久久久91| 亚洲国产日韩欧美综合久久 | 国产精品99久久久久久宅男 | 在线视频日韩精品| 欧美在线啊v| 在线观看精品| 欧美极品在线播放| 亚洲性夜色噜噜噜7777| 久久久久久九九九九| 亚洲激情影视| 国产精品免费电影| 久久久久久久久综合| 亚洲国产精品一区制服丝袜| 亚洲一区尤物| 亚洲高清一二三区| 欧美日韩亚洲视频一区| 欧美一级久久| 亚洲日本成人女熟在线观看| 欧美一区二区在线视频| 最新日韩在线视频| 国产日韩欧美| 欧美日本精品一区二区三区| 欧美一级片一区| 亚洲精品老司机| 久久九九国产| 亚洲深夜影院| 亚洲第一色在线| 国产精品久久久久一区| 免费亚洲电影在线| 午夜精彩国产免费不卡不顿大片| 欧美激情视频网站| 欧美在线观看日本一区| 欧美久久久久免费| 国产精品久久网站| 久久精品国产第一区二区三区最新章节 | 国产欧美日本一区二区三区| 久久人人爽人人| 亚洲欧美第一页| 亚洲精品国产无天堂网2021| 久久中文在线| 久久久99精品免费观看不卡| 正在播放欧美视频| 最新亚洲激情| 亚洲高清视频的网址| 国产毛片一区二区| 国产精品二区三区四区| 欧美成人亚洲成人日韩成人| 羞羞漫画18久久大片| 一本在线高清不卡dvd| 亚洲黄色精品| 欧美韩日精品| 欧美va天堂| 久热这里只精品99re8久| 久久国产精品久久久久久电车| 亚洲性av在线| 亚洲一区久久久| 一本色道久久88综合亚洲精品ⅰ| 亚洲精品国产精品国产自| 亚洲高清视频中文字幕| 影音先锋中文字幕一区| 黄色成人片子| 亚洲国产91色在线| 亚洲国产精品成人va在线观看| 在线观看一区欧美| 在线免费观看日本一区| 影音先锋中文字幕一区| 亚洲成人在线视频播放| 在线观看国产日韩| 亚洲日本电影在线| 亚洲精品国偷自产在线99热| 日韩视频精品在线| 亚洲一区二区三区涩| 亚洲欧美精品中文字幕在线| 亚洲欧美日韩综合一区| 欧美一二三视频| 久久久91精品国产一区二区三区| 久久gogo国模裸体人体| 久久久久久亚洲精品杨幂换脸| 女人天堂亚洲aⅴ在线观看| 欧美福利一区二区| 亚洲免费大片| 欧美伊久线香蕉线新在线| 久久久久久久性| 欧美久久久久久久| 国产精品久久久久一区二区| 国产日韩欧美日韩| 亚洲日本va在线观看| 99精品热视频| 久久av资源网| 一区二区三区四区五区精品| 日韩亚洲视频在线| 亚洲欧美日本视频在线观看| 久久精品国产2020观看福利| 免费不卡视频| 一区二区欧美亚洲| 欧美中文在线观看国产| 欧美a级片网站| 国产精品免费一区二区三区在线观看 | 中国女人久久久| 久久精品一区二区三区中文字幕| 另类亚洲自拍| 亚洲毛片av在线| 欧美在线视频免费观看| 欧美韩国一区| 狠狠入ady亚洲精品经典电影| 日韩视频在线观看一区二区| 久久激情综合| 99国内精品| 久久综合狠狠综合久久激情| 欧美视频日韩视频| 亚洲国产精品va在线看黑人| 欧美一区二区三区啪啪| 最新国产精品拍自在线播放| 香蕉免费一区二区三区在线观看 | 欧美午夜视频在线| 亚洲精美视频| 久久久久久电影| 亚洲天堂av高清| 欧美激情亚洲精品| 激情综合在线| 欧美在线地址| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲国产欧美一区二区三区丁香婷| 香蕉av福利精品导航| 亚洲精品一品区二品区三品区| 久久xxxx精品视频|