




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
函數(shù)的遞歸調(diào)用與分治策略遞歸方法是算法和程序設(shè)計(jì)中的一種重要技術(shù)。遞歸方法即通過函數(shù)或過程調(diào)用自身將問題轉(zhuǎn)化為本質(zhì)相同但規(guī)模較小的子問題。遞歸方法具有易于描述和理解、證明簡(jiǎn)單等優(yōu)點(diǎn),在動(dòng)態(tài)規(guī)劃、貪心算法、回溯法等諸多算法中都有著極為廣泛的應(yīng)用,是許多復(fù)雜算法的基礎(chǔ)。遞歸方法中所使用的“分而治之”的策略也稱分治策略。遞歸方法的構(gòu)造構(gòu)造遞歸方法的關(guān)鍵在于建立遞歸關(guān)系。這里的遞歸關(guān)系可以是遞歸描述的,也可以是遞推描述的。下面由一個(gè)求n的階乘的程序?yàn)槔?,總結(jié)出構(gòu)造遞歸方法的一般步驟。[例1]從鍵盤輸入正整數(shù)N(0<=N<=20),輸出N!。[分析]N!的計(jì)算是一個(gè)典型的遞歸問題。使用遞歸方法來描述程序,十分簡(jiǎn)單且易于理解。[步驟1]描述遞歸關(guān)系遞歸關(guān)系是這樣的一種關(guān)系。設(shè){U1,U2,U3,…,Un…}是一個(gè)序列,如果從某一項(xiàng)k開始,Un和它之前的若干項(xiàng)之間存在一種只與n有關(guān)的關(guān)系,這便稱為遞歸關(guān)系。注意到,當(dāng)N>=1時(shí),N!=N*(N-1)!(N=1時(shí),0!=1),這就是一種遞歸關(guān)系。對(duì)于特定的K!,它只與K與(K-1)!有關(guān)。[步驟2]確定遞歸邊界在步驟1的遞歸關(guān)系中,對(duì)大于k的Un的求解將最終歸結(jié)為對(duì)Uk的求解。這里的Uk稱為遞歸邊界(或遞歸出口)。在本例中,遞歸邊界為k=0,即0!=1。對(duì)于任意給定的N!,程序?qū)⒆罱K求解到0!。確定遞歸邊界十分重要,如果沒有確定遞歸邊界,將導(dǎo)致程序無限遞歸而引起死循環(huán)。例如以下程序:#include<iostream.h>識(shí)intf非(int展x){仁ret樣urn(f勸(x-1)管);}夜main(兇){和cou稱t<<f(凝10);}權(quán)它沒有規(guī)定黑遞歸邊界,幟運(yùn)行時(shí)將無吹限循環(huán),會(huì)塑導(dǎo)致錯(cuò)誤。少[步驟3]泊寫出遞歸函孤數(shù)并譯為代撫碼悔將步驟1從和步驟2中黨的遞歸關(guān)系計(jì)與邊界統(tǒng)一鈴起來用數(shù)學(xué)朵語言來表示蠶,即跡社N*(N輩-1)!番當(dāng)N>=1膀時(shí)n!=親許1語羊當(dāng)N=0時(shí)扣再將這種關(guān)笨系翻譯為代陽碼,即一個(gè)艇函數(shù):讀long書f(int頌n){五if(拖n==0)萄re歪t(yī)urn(礦1);else即re歷turn(殺n*f(n佛-1));}席[步驟4]符完善程序脊主要的遞歸阻函數(shù)已經(jīng)完厲成,將程序勉依題意補(bǔ)充旱完整即可。小//ex1劉.cpp肆#incl揀ude<興iostr捐eam.h臺(tái)>間lon雜gf(i野ntn)甜{刮if(驅(qū)n==0)姑re鐘turn(枯1);else燈re杰turn(舍n*f(n洲-1));}趟main(田){扇int刺n;維cin>涂>n;是cout陷<<end凍l<<f(耀n);}燃綜上,得出疤構(gòu)造一個(gè)遞逮歸方法基本胸步驟,即描各述遞歸關(guān)系工、確定遞歸趴邊界、寫出鉤遞歸函數(shù)并獄譯為代碼,發(fā)最后將程序渾完善。以下給繼續(xù)引用一漢些例子來討矮論遞歸方法鼠的應(yīng)用。悅經(jīng)典遞歸問蓬題磁以下討論兩草個(gè)十分經(jīng)典諸的遞歸問題杜。它們的算院法構(gòu)造同樣灑遵循剛剛得即出的四個(gè)步蠅驟。了解這洋兩個(gè)問題可號(hào)加深對(duì)遞歸密方法的理解褲。講[例2]F茫ibona凡cci數(shù)列柜(兔子繁殖謹(jǐn))問題:已公知無窮數(shù)列模A,滿足:使A(1)=酸A(2)=銹1,A(N紅)=A(N刻-1)+A燦(N-2)李(N>=3長)。從鍵盤哲輸入N,輸者出A(N)孤。附[分析]遞千歸關(guān)系十分捆明顯,由A橋(N)的表躺達(dá)式給出。旗需要注意的礎(chǔ)是本例中對(duì)閥于N>=3朱,A(N)半的值與A(晴N-1)和推A(N-2艇)都有關(guān)。[代碼]以//ex2巷.cpp翅#incl曬ude<描iostr丹eam.h捕>肆long浪fibon真acci(更intx帝){習(xí)if(鉤(x==后1)||命(x==蜘2))仆饑ret姿urn(1躺);else者re君turn(挪fibon鳳acci(殺x-1)+擁fibon場(chǎng)acci(趁x-2))裙;}臟main(答){稱int遺n;搬cin>嗽>n;冤cout想>>end潑l>>fi浮bonac塌ci(n)蟻;}吧[成例3]Ha立noi塔問樣題。漫[可問題描述]穗在霍比特人襪的圣廟里,秀有一塊黃銅使板,上面插辰著3根寶石議針(分別為純A號(hào),B號(hào)向和C號(hào))。個(gè)在A號(hào)針上縱從下到上套柿著從大到小納的n個(gè)圓形勾金片?,F(xiàn)要木將A針上的越金片全部移摔到C針上,扭且仍按照原貞來的順序疊誤置。移動(dòng)的貿(mào)規(guī)則如下:脫這些金片只挺能在3根針災(zāi)間移動(dòng),一錢次只能一片身,且任何時(shí)嫁候都不允許勾將較大的金倍片壓在較小慧的上面。從挖鍵盤輸入n孟,要求給出此移動(dòng)的次數(shù)勞和方案。藥[分析]由愛金片的個(gè)數(shù)非建立遞歸關(guān)腹系。當(dāng)n=誼1時(shí),只要凳將唯一的金驢片從A移到落C即可。當(dāng)毒n>1時(shí),發(fā)只要把較小掩的(n-1需)片按移動(dòng)奸規(guī)則從A移奶到B,再將枝剩下的最大陵的從A移到墊C(即中間偏“賴借助塵”場(chǎng)B把金片從貝A移到C)絕,再將B上青的(n-1叔)個(gè)金片按腿照規(guī)則從B挨移到C(中尋間依“瑞借助無”撇A)。延本題的特點(diǎn)挖在于不容易捉用數(shù)學(xué)語言渾寫出具體的使遞歸函數(shù),式但遞歸關(guān)系準(zhǔn)明顯,仍可都用遞歸方法漲求解。[代碼]滲//ex3早.囑cpp獎(jiǎng)#incl縣ude<后iostr升eam.h嘴>疊hanoi嚴(yán)(int飛n,cha睛rt1,跨char若t2,ch桐art3管){柴if(性n==1)荷co端ut<<"艘1"<<柿t1<<"坊"<<t槳3<<en鑼dl;else{右han哨oi(n-芳1,t1,撈t3,t2戰(zhàn));制cou濃t<<n<稼<""<升<t1<<讀""<<繩t3<<e奪ndl;丟han襲oi(n-團(tuán)1,t2,粗t1,t3厚);}}搭main(德){蓮int訴n;漂cout等<<"Pl菌ease寨enter墨the撫numbe油rof架Hanoi棉:";交cin>儉>n;弓cout監(jiān)<<"An起swer:變"<<en等dl;撫hano撈i(n,'揮A','B鼓','C'摔);}菌函數(shù)遞歸調(diào)戶用的應(yīng)用與湖分治策略攝許多算法都術(shù)采用了分治盡策略求解,召而可以說分狗治與遞歸是循一對(duì)孿生兄丸弟,它們經(jīng)掀常同時(shí)被應(yīng)于用于算法的病設(shè)計(jì)中。下陰面討論著名重的Cata功lan數(shù)問辣題,人們?cè)诳祵?duì)它的研究搖中充分應(yīng)用蕉了分治策略室。易[例4]C歪atala主n數(shù)問題。踢[問題描述兄]一個(gè)凸多億邊形,通過諒不相交于n笛邊形內(nèi)部的俗對(duì)角線,剖飄分為若干個(gè)乖三角形。求夠不同的剖分揀方案總數(shù)H司(n)。H堅(jiān)(n)即為教Catal墾an數(shù)。例爺如,n=5古時(shí)H(5)娃=5。蠻[分析]C聽atala污n數(shù)問題有培著明顯的遞罩歸子問題特穗征。在計(jì)算茄Catal轎an數(shù)時(shí)雖館然可以推導(dǎo)典出只關(guān)于n貸的一般公式崗,但在推導(dǎo)粗過程中卻要音用到遞歸公尋式。下面討校論三種不同舅的解法,其飽中第三種解多法沒有使用糕遞歸,它是丈由前兩種解督法推導(dǎo)而出蛾的。竹[解法1]續(xù)對(duì)于多邊形近V1V2饑…候Vn,對(duì)角僅線V1Vi脆(i=3,揭4,凈…樸,n-1)域?qū)⑵浞譃閮砂植糠?,一部福分是i邊形抗,另一部分久是n-i+杠1邊形。因打此,以對(duì)角稈線V1Vi償為一個(gè)剖分矩方案的剖分篇方案數(shù)為H間(i)*H難(n-i+往1)。還有的一種的特殊棟情形,是對(duì)蘇角線V2V餐n將其分為發(fā)一個(gè)三角形尼V1V2V漢n和一個(gè)n銜-2+1邊寧形。為了讓狠它同樣符合館粗體字給出貍的公式,規(guī)碧定H(2)罩=1。于是念得到公式:鉛H(n)=踢∑死H(i)*信H(n-i念+1)(爸i=2,3師,席…跑,n-1)付----布公式(1)炒H(2)=纖1驗(yàn)有了這個(gè)遞筒歸關(guān)系式,尸就可以用遞必推法或遞歸隱法解出H(扭n)。蛋[解法2]知從V1向除殃了V2和V旅n外的n-邁3個(gè)頂點(diǎn)可根作n-3條沙對(duì)角線。每峰一條對(duì)角線端V1Vi把雹多邊形剖分神成兩部分,爆剖分方案數(shù)鍬為H(i)左*H(n-降i+2),趨由于Vi可偷以是V3V般4登…蜘Vn-1中癢的任一點(diǎn),磁且V1可換券成V2,V微3,朽…慕,Vn中任召一點(diǎn)也有同系樣的結(jié)果。溉考慮到同一湯條對(duì)角線在奮2個(gè)頂點(diǎn)被奇重復(fù)計(jì)算了圈一次,于是默對(duì)每個(gè)由頂仆點(diǎn)和對(duì)角線得確定的剖分錢方案都乘以獨(dú)1/2,故倦有茅H(n)=島n懷∑竿(1/2)捧H(i)*尾H(n-i奉+2)(長i=3,4手,參…寬,n-1)腥把(1/2辛)提到興∑明外面,迷H(n)=糠n/(2*杠(n-3)別)星∑踐H(i)*符H(n-i烏+2)(潮i=3,4初,愉…雅,n-1)爆----羨公式(2)日規(guī)定H(2隸)=H(3炭)=1,這揉是合理的。鴉由公式(2河)和H(2核)=1,同稍樣可以用遞秋推法或遞歸布法解出H(份n)。店[解法3]勢(shì)把公式(淡1)中的自貿(mào)變量改為n擾+1,再將偏剛剛得出的衰公式(2)熱代入公式(液1),得到甘H(n+1予)=艷∑來H(i)*銀H(n-i鉛+2)(雁i=2,3可,愛…摸,n)早由公式(隨1)侍H(n+1念)=2*H注(n)+刃∑劑H(i)*麥H(n-i廳+2)(擁i=3,4截,雄…餃,n-1)潮由H黃(2)=1箭H(n+1核)=(4n顫-6)/n定*H(n)備由公既式(2)暑H(n)=貍(4n-1臟0)/(n博-1)*H較(n-1)嫁----須公式(3)開這是一個(gè)較捎之前兩種解朝法更為簡(jiǎn)單耐的遞歸公式例,還可以繼篇續(xù)簡(jiǎn)化為尾H(n)=裹1/(n-寺1)*C(鐵n-2,2戶n-4)凈----公奮式(4)種這就不需要醒再使用遞歸升算法了。然股而在程序設(shè)挖計(jì)上,公式借(4)反而清顯得更加復(fù)海雜,因?yàn)橐烙?jì)算階乘。糾因此最后給伍出由公式(稠3)作為理奸論依據(jù)范例甩程序代碼。價(jià)代碼相當(dāng)簡(jiǎn)怒單,這都?xì)w蚊功于剛才的海推導(dǎo)。如果悠用前兩種解農(nóng)法中的遞歸底關(guān)系,程序帝會(huì)變得復(fù)雜禿且容易寫錯(cuò)背。因此,有康時(shí)對(duì)具體問率題將遞歸關(guān)籍系公式進(jìn)行臺(tái)必要的化簡(jiǎn)您也是至關(guān)重字要的。[代碼]初//ex4棵.cpp雅#incl棚ude<裁iostr汪eam.h刊>伙#defi糧neMA車XN10桌0鏡long撓f(int恢x){歌if雙(x==3猶)麗r裂eturn詢(1);沿els稿e(cuò)舍r偵eturn撲((4*x普-10)*闖f(x-1擱)/(x-兩1));}妻main(牢){忘int始n;企co修ut<<"委\nPle插asei羨nput牧Nfor浮aCa塑talan租numb區(qū)er:";蹲cin辮>>n;炸if嬌((n<豎=MAXN絹)&&酷(n>=3耽))快c隊(duì)out<<僑"The濁answe竟ris:聽"<<f(遵n);}嘉本例編程時(shí)唉還有一個(gè)細(xì)董節(jié)問題需要男注意。注意來函數(shù)f中的厘斜體部分,感按照公式(習(xí)4)計(jì)算時(shí)辱一定要先進(jìn)屋行乘法再進(jìn)沾行除法運(yùn)算佩,因?yàn)?4幟*x-10治)并不總能利整除(x-康1),如果墾先進(jìn)行除法望則除出的小貢數(shù)部分將自房動(dòng)被舍去,悠從而導(dǎo)致得嫩到不正確的蘭解。冶數(shù)學(xué)上許多霉有重要意義勾的計(jì)數(shù)問題舅都可以歸結(jié)近為對(duì)Cat凱alan數(shù)慌的研究??沙揭钥吹剑径卫械倪f歸祖關(guān)系經(jīng)簡(jiǎn)化齊還是相當(dāng)簡(jiǎn)往單的。下面綿討論一個(gè)遞然歸關(guān)系略為慎復(fù)雜的例子周。伸[例5]快垮速排序問題線。急快速排序是抬程序設(shè)計(jì)中屯經(jīng)常涉及的修一種排序算狠法。它的最稀好時(shí)間復(fù)雜奪度為O(n古log2n齡),最差為蘇O(n2)質(zhì),是一種不磨穩(wěn)定的排序因方法(大小用相同的數(shù)在玩排序后可能劍交換位置)擁。漆[算法描述嚴(yán)]快速排序扇的一種基本皇思想是:要摔將n個(gè)數(shù)按漲由小到大排弄列,在待排盒序的n個(gè)數(shù)第中選取任一付個(gè)數(shù)(在本第例中取第一幫個(gè)),稱為白基準(zhǔn)數(shù),在訊每一次快速章排序過程中斯設(shè)置兩個(gè)指倒示器i和j糊,對(duì)基準(zhǔn)數(shù)蘋左邊和右邊看的數(shù)同時(shí)從聽最左(i)飄和最右(j揀)開始進(jìn)行蜻掃描(i逐窗1遞增,j閃逐1遞減)畢,直到找到蕩從左邊開始釣的某個(gè)i大鵝于或等于基墾準(zhǔn)數(shù),從右交邊開始的某殘個(gè)j小于或顛等于基準(zhǔn)數(shù)鴨。一旦發(fā)現(xiàn)鈔這樣的i和叉j(暫且稱然之為一個(gè)壯“暮逆序?qū)椤狈拢?,則把第冬i個(gè)數(shù)和第耽j個(gè)數(shù)交換匆位置,這樣市它們就不再住是逆序?qū)α私?,緊接著再庸將i遞增1點(diǎn),j遞減1蘆。如此反復(fù)晝,在交換過藍(lán)有限個(gè)逆序開對(duì)后,i和揉j將越來越津靠近,最后笛“教相遇招”仗,即i和j捏指向同一個(gè)吼數(shù),暫且稱催之為相遇數(shù)傲(極端情況誰下,如果一篩開始就不存濃在逆序?qū)?,旺i和j將直沈接嘗“里相遇嫂”度)。相遇后安就保證數(shù)列狠中沒有逆序扎對(duì)了(除了看在上述的極日端情況下基鉗準(zhǔn)數(shù)和自身兆也算構(gòu)成一論個(gè)逆序?qū)?,銅注意粗體字瞇給出的逆序針對(duì)的定義)航。繼續(xù)掃描赤,非極端情翻況下,由于下數(shù)列中已經(jīng)招沒有逆序?qū)Χ?,i遞增1囑(如果相遇伴數(shù)小于基準(zhǔn)陷數(shù))或者j營遞減1(如穴果相遇數(shù)大盈于基準(zhǔn)數(shù))忙后即算完成配了一趟快速秧排序,這時(shí)睜第1到第j肝個(gè)數(shù)中的每南個(gè)都保證小腿于或等于基挎準(zhǔn)數(shù),第i盤到第n個(gè)數(shù)搬中的每個(gè)保越證大于或等攝于基準(zhǔn)數(shù)。五此時(shí),遞歸市調(diào)用函數(shù),降對(duì)第1到第娘j個(gè)數(shù)和第增i到第n個(gè)干數(shù)分別再進(jìn)椒行一趟快速絹排序。如果短在極端情況軋下,程序認(rèn)淺為基準(zhǔn)數(shù)和辛自身構(gòu)成逆庭序?qū)?,則將銹基準(zhǔn)數(shù)與自短身交換(這產(chǎn)其實(shí)沒有作截用)之后i顏遞增1,j匙遞減1(注燦意斜體字給仍出的對(duì)逆序津?qū)Φ奶幚矸蕉ǎ?,同樣榴?duì)第1到第唱j個(gè)數(shù)和第怒i到第n個(gè)眾數(shù)分別再進(jìn)默行一趟快速魚排序。咬最后的問題呀就是確定遞剖歸邊界。由瓜于被排序的柿數(shù)列將不斷研被劃分為兩車個(gè)至少含一錫個(gè)數(shù)的子列怎(因?yàn)樵诿刻杼伺判蜃詈蟠暨M(jìn)行遞歸調(diào)弄用函數(shù)時(shí)i進(jìn)<>j),桐最后子列的姨長度將變?yōu)樗?。這就是同遞歸的邊界伯。在程序?qū)嵜F(xiàn)是,本著伸“件能排則排升”冶的原則,只半要第一個(gè)數(shù)誕小于j(或虧者第i個(gè)數(shù)理小于最后一怒個(gè)數(shù)),即喉進(jìn)行遞歸。私[主程序(臥遞歸函數(shù)體宇)]劇void奸Quick熟Sort(酒RecTy竭peR[按],in尸ts,i付ntt){沖int饅i=s,古j=t,k故;稍R趕ecTyp童etem突p;石if涉(s<t){弊擠temp=蝦R[s]詳//用區(qū)證間第1個(gè)記懸錄作為基準(zhǔn)薪怒while內(nèi)(i!=咸j)//拌從兩端向中憲間交替掃描抓,直至i=姜j;歌釀{捉千w呈hile(裹j>i&倡&R[j]牽.key>壓temp.朵key)搏蔬建識(shí)j--;曾閥i腦f(i<j磁)咬瀉烈{迷栽犧滋R[i]=兇R[j];愚屈經(jīng)注i++;蝕襯壇}厚貞切whil奇e(i<掛j&&R[漲i].ke艙y<tem每p.key墨)藝妄嫂沙i++;撇詞i展f(i<j燕)趙胸帽{繪申睬鉤R[j]=蟲R[i];貸扶滴統(tǒng)j--;呢而焦}嫌蛾}評(píng)R[致i]=te臂mp;妥Qu繪ickSo骨rt(R,兄s,i-1嘴);竊Qu始ickSo繁rt(R,績(jī)i+1,t鄉(xiāng));}}惡[節(jié)例6]怨“達(dá)九宮陣族”架智力游戲。遼[問題描述戰(zhàn)]一個(gè)9跟×鑼9方陣,由尖9個(gè)袋“熄九宮格才”軋組成,每個(gè)辨九宮格又由母3陸×骨3共9個(gè)小則格子組成。羞請(qǐng)?jiān)诿總€(gè)空閱白小格子里番面填上1~法9的數(shù)字,暗使每個(gè)數(shù)字印在每個(gè)九宮客格內(nèi)以及在貧整個(gè)九宮陣省中的每行、物每列上均出默現(xiàn)一次。采(1)編程馬將下面圖中壓的九宮陣補(bǔ)斥充完整。?。?)討論粱是否可能給落出末“附九宮陣呼”眨的全部解?叢[分析]本封題可利用回虎溯法解決,挽其基本思想存為深度優(yōu)先容搜索(DF換S),這也孤是一種以分場(chǎng)治策略為基泉礎(chǔ)的算法。鈴回溯法與純憑粹的DFS息不同的是,率它在搜索過甲程中不斷殺違死不合題意蛾的結(jié)點(diǎn)。這惕一點(diǎn)保證了壇解法的效率疤。角首先考慮如工何得出全部矩解的情況。雙解空間樹容胖易構(gòu)造,只丑需按順序(別從第一行第樓一個(gè)數(shù)字開欄始到第一行耽最后一個(gè),閘然后第二行晚……生,一直到最或后一行最后灶一個(gè)數(shù)字)軟“無嘗試搬”僻填入數(shù)字即帶可。褲為了解決這跡個(gè)問題,我鑼們需要先編踐寫一個(gè)函數(shù)臺(tái)check隔,其原型為悉intc最heck(親inti中,int枕j,int周k),用引于求第i行旺第j列能否蔽填上數(shù)字k尿。如果可以漫,返回1,度否則返回0倉。由于我們銳是按順序填事入數(shù)字的,銅看起來一個(gè)夠數(shù)字后面的芽數(shù)字并不在剩判斷能否填鋤的范圍內(nèi)。殊但為了解決小題中某個(gè)特礎(chǔ)解問題的方盾便,還是引乎入較為嚴(yán)謹(jǐn)釘?shù)呐袛喾椒?。麗函?shù)che櫻ck代碼如依下:貢intc傭heck(蹤inti幕,int博j,int縫k){僑int乘l,m,丑pi,pj恰;穩(wěn)//1蜜.Che剃ckth破elin購e大for舌(l=1光;l<=9飄;l++)奇i丸f((萌l!=j)深&&(序a[i][喇l]!=0激)&&孔(a[i]暮[l]==宿k))攤德retu霧rn(0)扶;踏//2挎.Che兆ckth氧ecol稀umn這for騙(l=1遍;l<=9他;l++)職i側(cè)f((膊l!=i)睬&&(多a[l][表j]!=0百)&&駕(a[l]蟲[j]==屆k))緩拍retu階rn(0)使;迷//3姜.Che餃ckth預(yù)e3x3玉matr逼ix高//3槳.1Fi灘rstly份we書will江h(huán)ave獄toch屠eckt苗hepa悠rent_康i(pi)鄭and劍paren鄭t_j(p銀j)線if吃(i<=3知)pi=溉1;產(chǎn)els渡eif學(xué)(i<=6劃)pi=將4;矩els悔epi=破7;冷if迫(j<=3斧)pj=績(jī)1;夫els盞eif抵(j<=6規(guī))pj=壺4;凈els區(qū)epj=效7;航//3忙.2No襯wwe圣canc褲heck監(jiān)it批for接(l=0補(bǔ);l<=2扶;l++)個(gè)fo央r(m=煉0;m<=檢2;m++蔬){捎蒼if(卡((pi+智l)!=i拉)&&珠((pj+譯m)!=j朋))港惜if枕((a陣[pi+l秩][pj+扒m]!=0蓮)&&屬(a[炭pi+l]障[pj+m頁]==k憑))烤嚼re專turn(弱0);}幟ret命urn(1姨);}驚結(jié)合注釋很域容易就能接細(xì)受函數(shù)的思祝想,不予過賠多說明。鏟下面考慮程姑序最重要的插部分,即遞歌歸函數(shù)。思尾路是這樣的嶺:假設(shè)某一板格能填入某吼數(shù),把這個(gè)蔥格子看成解昌空間樹的一宿個(gè)結(jié)點(diǎn),由曉它可以擴(kuò)展俱出9個(gè)兒子籠,即下一格購填什么數(shù)(貞由1到9逐序個(gè)嘗試)。閑對(duì)下一格,粒同樣這樣考龜慮。不斷用稈函數(shù)che拆ck函數(shù)考孝察某一個(gè)能環(huán)否填入某數(shù)柄,一旦函數(shù)鄰check旗返回0,則勁殺死這個(gè)結(jié)香點(diǎn)。鞭如果能一直遷填到最后一蕩個(gè)數(shù),結(jié)點(diǎn)翠仍未被殺死扎,則這是一弦個(gè)解。景這種思想可旅用偽代碼表津示如下:閑proce券dure厘backt限r(nóng)ack(扛i,j,k鍵:inte乒ger);關(guān)if烤check已(i,j,怖k)=tr制ueth犁en繼beg撐in盯a[薯i,j]=抱k;客Ge恰nerat潛e_nex捏t_i_a劈nd_j;撕if缺i<10輩then景be噸gin丙就forl歲:=1t場(chǎng)o9d普o腎麗bac督ktrac擋k(i,j舒,l);endelse甲Do_端Outpu雁t;費(fèi)a[i,j核]:=0;波end明;斧注意斜體的怎“貝a[i,j荒]:=0倒”失必不可少!鋒當(dāng)對(duì)某個(gè)結(jié)律點(diǎn)(x,y帖)擴(kuò)展的過換程中,可能宇在擴(kuò)展到(位x+m,y旱+n)時(shí)它稠的子樹被完峽全殺死(每竹個(gè)結(jié)點(diǎn)都被亮殺死,亦即堡按照(x,抬y)及之前述的填數(shù)方案傾填數(shù),無解善)。這時(shí)需左要保證(x頑,y)以后悼所填的數(shù)被并重新置零,樸這個(gè)語句的皂作用即在每舊個(gè)結(jié)點(diǎn)被殺連死時(shí)都將其未置零。徑將偽代碼翻污譯為C++穗代碼:蜜backt輔rack(測(cè)inti兆,int懸j,int語k){伯int育l;嫁if灑(che魯ck(i,蹦j,k)=露=1){鉤a殼[i][j叢]=k;綱//Fil虛lin頓theo朝kays免oluti染on珠/片/Gene枯rate捐next跟i,j拼i獲f(j<洪9)j+詞+;鼻槐else即{i+羊+;j=橡1;}霜//End稅ofG角enera聰tene肉xti,胳j理i和f(i<挽10){意亂fo決r(l=由1;l<=產(chǎn)9;l++言)計(jì)乒bac他ktrac驗(yàn)k(i,j堵,l);頓童}家e占lse猜閃outp依ut();痰a盆[i][j誓]=0;評(píng)/*Whe桿nfai凡lsan跡dgoe旅supp晴erwar柿ds,t你heva囑luem彼ustb那ecle襖ared*話/}}塑函數(shù)out罰put()魯用雙重循環(huán)乓完成輸出。防在主函數(shù)m緒ain()蜻對(duì)back閥track歇(1,1,兔i)進(jìn)行一繳個(gè)循環(huán),i折從1取到9悲,即可完成辦整個(gè)程序。櫻運(yùn)行時(shí)發(fā)現(xiàn)搭九宮格的解掏相當(dāng)多,即系使保存到文臺(tái)件中也不現(xiàn)咱實(shí)。這就回蓄答了第2個(gè)次問題。蕩對(duì)于第1個(gè)藏問題,將這新個(gè)程序略加蛙改動(dòng),即賦慈予全局?jǐn)?shù)組輛a以初值,拖并在過程b光acktr楚ack中產(chǎn)蒸生下一個(gè)i課和j時(shí)跳過華有初值的部吼分,即可將威程序轉(zhuǎn)化為偏求填有部分循空缺的九宮坊格程序。全最后給出填押充有部分空吳缺的九宮格敬的完整源代癢碼。博#incl炊ude<昨iostr父eam>樂using覽name失space瓣std;閑inta沿[11][排11]={謊0};啊intc駝heck(筒inti店,int宴j,int疾k){布int膊l,m,陰pi,pj悶;犬//1盤.Che邀ckth著elin宰e父for刷(l=1漁;l<=9期;l++)忽if(蓮(l!=舟j)&&響(a[i丑][l]!呀=0)&期&(a[斗i][l]恐==k)時(shí))病re服turn(搭0);唇//2極.Che價(jià)ckth稱ecol災(zāi)umn墨for爭(zhēng)(l=1尿;l<=9疾;l++)肯if(械(l!=辦i)&&狂(a[l悲][j]!梨=0)&等&(a[薪l][j]辰==k)吉)后re脊turn(茂0);櫻//3敢.Che嶼ckth簽e3x3株matr懸ix間//3輸.1Fi圾rstly寫wew米illh暑avet絡(luò)oche羅ckth廟epar扎ent_i掏(pi)仿andp鋤arent晨_j(pj玻)駐if賠(i<=3牌)pi=柄1;桶els疫eif韻(i<=6萌)pi=廁4;干els尺epi=寶7;轉(zhuǎn)if壺(j<=3縫)pj=亞1;我els旋eif輪(j<=6錦)pj=政4;汽els平epj=玩7;勉//3徹.2No唯wwe姓canc拔heck硬it鍵for越(l=0麥;l<=2里;l++)澤fo笛r(m=電0;m<=越2;m++員){元if愛(((p婆i+l)!永=i)&關(guān)&((p憲j+m)!伯=j))清i塵f((區(qū)a[pi厭+l][p斯j+m]!聲=0)淋&&(拼a[pi+繳l][pj南+m]==含k))五re羞turn(亮0);}釘ret關(guān)urn(1低);}騙void朵outp湯ut(){呆int楊i,j;導(dǎo)cou失t<<"O覽neso欲lutio返nis:剩"<<en悔dl;悔for招(i=1纖;i<=9術(shù);i++){領(lǐng)for餐(j=1;勿j<=9;斑j++)漿co織ut<<a馬[i][j搭]<<"儲(chǔ)";扎cout寫<<end擺l;}}嗽void鮮
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 菏澤一調(diào)考試數(shù)學(xué)試卷
- 廣州今年中考的數(shù)學(xué)試卷
- 廣豐區(qū)初三二模數(shù)學(xué)試卷
- 健康管理重要性課件
- 《網(wǎng)絡(luò)綜合布線》教案 項(xiàng)目1任務(wù)1 綜合布線系統(tǒng)
- 山東省泰安市寧陽一中2025屆物理高一第二學(xué)期期末考試模擬試題含解析
- 中國可調(diào)射頻衰減器行業(yè)市場(chǎng)前景預(yù)測(cè)及投資價(jià)值評(píng)估分析報(bào)告
- 工地自查報(bào)告(共6)
- 2018-2024年中國花生醬行業(yè)市場(chǎng)評(píng)估分析及投資發(fā)展盈利預(yù)測(cè)報(bào)告
- 2025年中國連續(xù)式回轉(zhuǎn)窯行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 互聯(lián)網(wǎng)導(dǎo)論智慧樹知到課后章節(jié)答案2023年下上海第二工業(yè)大學(xué)
- 乙醇酸安全技術(shù)說明書(msds)
- 《旅游學(xué)概論》第七章
- 工程物探-第五章電法勘探課件
- KSS編碼說明電廠KKS編號(hào)
- 臺(tái)區(qū)線損綜合分析臺(tái)區(qū)線損分類及計(jì)算方法
- 人民醫(yī)院普外科臨床技術(shù)操作規(guī)范2023版
- 【酒店管理系統(tǒng)的設(shè)計(jì)與開發(fā)(論文)】
- 舉一反三- 三年級(jí)奧數(shù) - 第37講 面積計(jì)算
- 2023年云南玉溪市直事業(yè)單位選調(diào)45人筆試備考試題及答案解析
- 醫(yī)院健康體檢表
評(píng)論
0/150
提交評(píng)論