函數(shù)的遞歸調(diào)用與分治策略_第1頁
函數(shù)的遞歸調(diào)用與分治策略_第2頁
函數(shù)的遞歸調(diào)用與分治策略_第3頁
函數(shù)的遞歸調(diào)用與分治策略_第4頁
函數(shù)的遞歸調(diào)用與分治策略_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

函數(shù)的遞歸調(diào)用與分治策略遞歸方法是算法和程序設(shè)計中的一種重要技術(shù)。遞歸方法即通過函數(shù)或過程調(diào)用自身將問題轉(zhuǎn)化為本質(zhì)相同但規(guī)模較小的子問題。遞歸方法具有易于描述和理解、證明簡單等優(yōu)點,在動態(tài)規(guī)劃、貪心算法、回溯法等諸多算法中都有著極為廣泛的應(yīng)用,是許多復(fù)雜算法的基礎(chǔ)。遞歸方法中所使用的“分而治之”的策略也稱分治策略。遞歸方法的構(gòu)造構(gòu)造遞歸方法的關(guān)鍵在于建立遞歸關(guān)系。這里的遞歸關(guān)系可以是遞歸描述的,也可以是遞推描述的。下面由一個求n的階乘的程序為例,總結(jié)出構(gòu)造遞歸方法的一般步驟。[例1]從鍵盤輸入正整數(shù)N(0<=N<=20),輸出N!。[分析]N!的計算是一個典型的遞歸問題。使用遞歸方法來描述程序,十分簡單且易于理解。[步驟1]描述遞歸關(guān)系遞歸關(guān)系是這樣的一種關(guān)系。設(shè){U1,U2,U3,…,Un…}是一個序列,如果從某一項k開始,Un和它之前的若干項之間存在一種只與n有關(guān)的關(guān)系,這便稱為遞歸關(guān)系。注意到,當(dāng)N>=1時,N!=N*(N-1)!(N=1時,0!=1),這就是一種遞歸關(guān)系。對于特定的K!,它只與K與(K-1)!有關(guān)。[步驟2]確定遞歸邊界在步驟1的遞歸關(guān)系中,對大于k的Un的求解將最終歸結(jié)為對Uk的求解。這里的Uk稱為遞歸邊界(或遞歸出口)。在本例中,遞歸邊界為k=0,即0!=1。對于任意給定的N!,程序?qū)⒆罱K求解到0!。確定遞歸邊界十分重要,如果沒有確定遞歸邊界,將導(dǎo)致程序無限遞歸而引起死循環(huán)。例如以下程序:#include<iostream.h>識intf非(int展x){仁ret樣urn(f勸(x-1)管);}夜main(兇){和cou稱t<<f(凝10);}權(quán)它沒有規(guī)定黑遞歸邊界,幟運行時將無吹限循環(huán),會塑導(dǎo)致錯誤。少[步驟3]泊寫出遞歸函孤數(shù)并譯為代撫碼悔將步驟1從和步驟2中黨的遞歸關(guān)系計與邊界統(tǒng)一鈴起來用數(shù)學(xué)朵語言來表示蠶,即跡社N*(N輩-1)!番當(dāng)N>=1膀時n!=親許1語羊當(dāng)N=0時扣再將這種關(guān)笨系翻譯為代陽碼,即一個艇函數(shù):讀long書f(int頌n){五if(拖n==0)萄re歪t(yī)urn(礦1);else即re歷turn(殺n*f(n佛-1));}席[步驟4]符完善程序脊主要的遞歸阻函數(shù)已經(jīng)完厲成,將程序勉依題意補充旱完整即可。小//ex1劉.cpp肆#incl揀ude<興iostr捐eam.h臺>間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)造一個遞逮歸方法基本胸步驟,即描各述遞歸關(guān)系工、確定遞歸趴邊界、寫出鉤遞歸函數(shù)并獄譯為代碼,發(fā)最后將程序渾完善。以下給繼續(xù)引用一漢些例子來討矮論遞歸方法鼠的應(yīng)用。悅經(jīng)典遞歸問蓬題磁以下討論兩草個十分經(jīng)典諸的遞歸問題杜。它們的算院法構(gòu)造同樣灑遵循剛剛得即出的四個步蠅驟。了解這洋兩個問題可號加深對遞歸密方法的理解褲。講[例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ǔ)是本例中對閥于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場acci(趁x-2))裙;}臟main(答){稱int遺n;搬cin>嗽>n;冤cout想>>end潑l>>fi浮bonac塌ci(n)蟻;}吧[成例3]Ha立noi塔問樣題。漫[可問題描述]穗在霍比特人襪的圣廟里,秀有一塊黃銅使板,上面插辰著3根寶石議針(分別為純A號,B號向和C號)。個在A號針上縱從下到上套柿著從大到小納的n個圓形勾金片?,F(xiàn)要木將A針上的越金片全部移摔到C針上,扭且仍按照原貞來的順序疊誤置。移動的貿(mào)規(guī)則如下:脫這些金片只挺能在3根針災(zāi)間移動,一錢次只能一片身,且任何時嫁候都不允許勾將較大的金倍片壓在較小慧的上面。從挖鍵盤輸入n孟,要求給出此移動的次數(shù)勞和方案。藥[分析]由愛金片的個數(shù)非建立遞歸關(guān)腹系。當(dāng)n=誼1時,只要凳將唯一的金驢片從A移到落C即可。當(dāng)毒n>1時,發(fā)只要把較小掩的(n-1需)片按移動奸規(guī)則從A移奶到B,再將枝剩下的最大陵的從A移到墊C(即中間偏“賴借助塵”場B把金片從貝A移到C)絕,再將B上青的(n-1叔)個金片按腿照規(guī)則從B挨移到C(中尋間依“瑞借助無”撇A)。延本題的特點挖在于不容易捉用數(shù)學(xué)語言渾寫出具體的使遞歸函數(shù),式但遞歸關(guān)系準(zhǔn)明顯,仍可都用遞歸方法漲求解。[代碼]滲//ex3早.囑cpp獎#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-團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ù)采用了分治盡策略求解,召而可以說分狗治與遞歸是循一對孿生兄丸弟,它們經(jīng)掀常同時被應(yīng)于用于算法的病設(shè)計中。下陰面討論著名重的Cata功lan數(shù)問辣題,人們在康對它的研究搖中充分應(yīng)用蕉了分治策略室。易[例4]C歪atala主n數(shù)問題。踢[問題描述兄]一個凸多億邊形,通過諒不相交于n笛邊形內(nèi)部的俗對角線,剖飄分為若干個乖三角形。求夠不同的剖分揀方案總數(shù)H司(n)。H堅(n)即為教Catal墾an數(shù)。例爺如,n=5古時H(5)娃=5。蠻[分析]C聽atala污n數(shù)問題有培著明顯的遞罩歸子問題特穗征。在計算茄Catal轎an數(shù)時雖館然可以推導(dǎo)典出只關(guān)于n貸的一般公式崗,但在推導(dǎo)粗過程中卻要音用到遞歸公尋式。下面討校論三種不同舅的解法,其飽中第三種解多法沒有使用糕遞歸,它是丈由前兩種解督法推導(dǎo)而出蛾的。竹[解法1]續(xù)對于多邊形近V1V2饑…候Vn,對角僅線V1Vi脆(i=3,揭4,凈…樸,n-1)域?qū)⑵浞譃閮砂植糠郑徊扛7质莍邊形抗,另一部分久是n-i+杠1邊形。因打此,以對角稈線V1Vi償為一個剖分矩方案的剖分篇方案數(shù)為H間(i)*H難(n-i+往1)。還有的一種的特殊棟情形,是對蘇角線V2V餐n將其分為發(fā)一個三角形尼V1V2V漢n和一個n銜-2+1邊寧形。為了讓狠它同樣符合館粗體字給出貍的公式,規(guī)碧定H(2)罩=1。于是念得到公式:鉛H(n)=踢∑死H(i)*信H(n-i念+1)(爸i=2,3師,席…跑,n-1)付----布公式(1)炒H(2)=纖1驗有了這個遞筒歸關(guān)系式,尸就可以用遞必推法或遞歸隱法解出H(扭n)。蛋[解法2]知從V1向除殃了V2和V旅n外的n-邁3個頂點可根作n-3條沙對角線。每峰一條對角線端V1Vi把雹多邊形剖分神成兩部分,爆剖分方案數(shù)鍬為H(i)左*H(n-降i+2),趨由于Vi可偷以是V3V般4登…蜘Vn-1中癢的任一點,磁且V1可換券成V2,V微3,朽…慕,Vn中任召一點也有同系樣的結(jié)果。溉考慮到同一湯條對角線在奮2個頂點被奇重復(fù)計算了圈一次,于是默對每個由頂仆點和對角線得確定的剖分錢方案都乘以獨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]勢把公式(淡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)開這是一個較捎之前兩種解朝法更為簡單耐的遞歸公式例,還可以繼篇續(xù)簡化為尾H(n)=裹1/(n-寺1)*C(鐵n-2,2戶n-4)凈----公奮式(4)種這就不需要醒再使用遞歸升算法了。然股而在程序設(shè)挖計上,公式借(4)反而清顯得更加復(fù)海雜,因為要咐計算階乘。糾因此最后給伍出由公式(稠3)作為理奸論依據(jù)范例甩程序代碼。價代碼相當(dāng)簡怒單,這都?xì)w蚊功于剛才的海推導(dǎo)。如果悠用前兩種解農(nóng)法中的遞歸底關(guān)系,程序帝會變得復(fù)雜禿且容易寫錯背。因此,有康時對具體問率題將遞歸關(guā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舍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隊out<<僑"The濁answe竟ris:聽"<<f(遵n);}嘉本例編程時唉還有一個細(xì)董節(jié)問題需要男注意。注意來函數(shù)f中的厘斜體部分,感按照公式(習(xí)4)計算時辱一定要先進屋行乘法再進沾行除法運算佩,因為(4幟*x-10治)并不總能利整除(x-康1),如果墾先進行除法望則除出的小貢數(shù)部分將自房動被舍去,悠從而導(dǎo)致得嫩到不正確的蘭解。冶數(shù)學(xué)上許多霉有重要意義勾的計數(shù)問題舅都可以歸結(jié)近為對Cat凱alan數(shù)慌的研究??沙揭钥吹?,本段例中的遞歸祖關(guān)系經(jīng)簡化齊還是相當(dāng)簡往單的。下面綿討論一個遞然歸關(guān)系略為慎復(fù)雜的例子周。伸[例5]快垮速排序問題線。急快速排序是抬程序設(shè)計中屯經(jīng)常涉及的修一種排序算狠法。它的最稀好時間復(fù)雜奪度為O(n古log2n齡),最差為蘇O(n2)質(zhì),是一種不磨穩(wěn)定的排序因方法(大小用相同的數(shù)在玩排序后可能劍交換位置)擁。漆[算法描述嚴(yán)]快速排序扇的一種基本皇思想是:要摔將n個數(shù)按漲由小到大排弄列,在待排盒序的n個數(shù)第中選取任一付個數(shù)(在本第例中取第一幫個),稱為白基準(zhǔn)數(shù),在訊每一次快速章排序過程中斯設(shè)置兩個指倒示器i和j糊,對基準(zhǔn)數(shù)蘋左邊和右邊看的數(shù)同時從聽最左(i)飄和最右(j揀)開始進行蜻掃描(i逐窗1遞增,j閃逐1遞減)畢,直到找到蕩從左邊開始釣的某個i大鵝于或等于基墾準(zhǔn)數(shù),從右交邊開始的某殘個j小于或顛等于基準(zhǔn)數(shù)鴨。一旦發(fā)現(xiàn)鈔這樣的i和叉j(暫且稱然之為一個壯“暮逆序?qū)椤狈拢瑒t把第冬i個數(shù)和第耽j個數(shù)交換匆位置,這樣市它們就不再住是逆序?qū)α私?,緊接著再庸將i遞增1點,j遞減1蘆。如此反復(fù)晝,在交換過藍(lán)有限個逆序開對后,i和揉j將越來越津靠近,最后笛“教相遇招”仗,即i和j捏指向同一個吼數(shù),暫且稱催之為相遇數(shù)傲(極端情況誰下,如果一篩開始就不存濃在逆序?qū)?,旺i和j將直沈接嘗“里相遇嫂”度)。相遇后安就保證數(shù)列狠中沒有逆序扎對了(除了看在上述的極日端情況下基鉗準(zhǔn)數(shù)和自身兆也算構(gòu)成一論個逆序?qū)?,銅注意粗體字瞇給出的逆序針對的定義)航。繼續(xù)掃描赤,非極端情翻況下,由于下數(shù)列中已經(jīng)招沒有逆序?qū)Χ?,i遞增1囑(如果相遇伴數(shù)小于基準(zhǔn)陷數(shù))或者j營遞減1(如穴果相遇數(shù)大盈于基準(zhǔn)數(shù))忙后即算完成配了一趟快速秧排序,這時睜第1到第j肝個數(shù)中的每南個都保證小腿于或等于基挎準(zhǔn)數(shù),第i盤到第n個數(shù)搬中的每個保越證大于或等攝于基準(zhǔn)數(shù)。五此時,遞歸市調(diào)用函數(shù),降對第1到第娘j個數(shù)和第增i到第n個干數(shù)分別再進椒行一趟快速絹排序。如果短在極端情況軋下,程序認(rèn)淺為基準(zhǔn)數(shù)和辛自身構(gòu)成逆庭序?qū)Γ瑒t將銹基準(zhǔn)數(shù)與自短身交換(這產(chǎn)其實沒有作截用)之后i顏遞增1,j匙遞減1(注燦意斜體字給仍出的對逆序津?qū)Φ奶幚矸蕉ǎ?,同樣榴對?到第唱j個數(shù)和第怒i到第n個眾數(shù)分別再進默行一趟快速魚排序。咬最后的問題呀就是確定遞剖歸邊界。由瓜于被排序的柿數(shù)列將不斷研被劃分為兩車個至少含一錫個數(shù)的子列怎(因為在每惕趟排序最后呆進行遞歸調(diào)弄用函數(shù)時i進<>j),桐最后子列的姨長度將變?yōu)樗?。這就是同遞歸的邊界伯。在程序?qū)嵜F(xiàn)是,本著伸“件能排則排升”冶的原則,只半要第一個數(shù)誕小于j(或虧者第i個數(shù)理小于最后一怒個數(shù)),即喉進行遞歸。私[主程序(臥遞歸函數(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個記懸錄作為基準(zhǔn)薪怒while內(nèi)(i!=咸j)//拌從兩端向中憲間交替掃描抓,直至i=姜j;歌釀{捉千w呈hile(裹j>i&倡&R[j]牽.key>壓temp.朵key)搏蔬建識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--;呢而焦}嫌蛾}評R[致i]=te臂mp;妥Qu繪ickSo骨rt(R,兄s,i-1嘴);竊Qu始ickSo繁rt(R,績i+1,t鄉(xiāng));}}惡[節(jié)例6]怨“達(dá)九宮陣族”架智力游戲。遼[問題描述戰(zhàn)]一個9跟×鑼9方陣,由尖9個袋“熄九宮格才”軋組成,每個辨九宮格又由母3陸×骨3共9個小則格子組成。羞請在每個空閱白小格子里番面填上1~法9的數(shù)字,暗使每個數(shù)字印在每個九宮客格內(nèi)以及在貧整個九宮陣省中的每行、物每列上均出默現(xiàn)一次。采(1)編程馬將下面圖中壓的九宮陣補斥充完整。恰(2)討論粱是否可能給落出末“附九宮陣呼”眨的全部解?叢[分析]本封題可利用回虎溯法解決,挽其基本思想存為深度優(yōu)先容搜索(DF換S),這也孤是一種以分場治策略為基泉礎(chǔ)的算法。鈴回溯法與純憑粹的DFS息不同的是,率它在搜索過甲程中不斷殺違死不合題意蛾的結(jié)點。這惕一點保證了壇解法的效率疤。角首先考慮如工何得出全部矩解的情況。雙解空間樹容胖易構(gòu)造,只丑需按順序(別從第一行第樓一個數(shù)字開欄始到第一行耽最后一個,閘然后第二行晚……生,一直到最或后一行最后灶一個數(shù)字)軟“無嘗試搬”僻填入數(shù)字即帶可。褲為了解決這跡個問題,我鑼們需要先編踐寫一個函數(shù)臺check隔,其原型為悉intc最heck(親inti中,int枕j,int周k),用引于求第i行旺第j列能否蔽填上數(shù)字k尿。如果可以漫,返回1,度否則返回0倉。由于我們銳是按順序填事入數(shù)字的,銅看起來一個夠數(shù)字后面的芽數(shù)字并不在剩判斷能否填鋤的范圍內(nèi)。殊但為了解決小題中某個特礎(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=績1;夫els盞eif抵(j<=6規(guī))pj=壺4;凈els區(qū)epj=效7;航//3忙.2No襯wwe圣canc褲heck監(jiān)it批for接(l=0補;l<=2扶;l++)個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ù),把這個蔥格子看成解昌空間樹的一宿個結(jié)點,由曉它可以擴展俱出9個兒子籠,即下一格購填什么數(shù)(貞由1到9逐序個嘗試)。閑對下一格,粒同樣這樣考龜慮。不斷用稈函數(shù)che拆ck函數(shù)考孝察某一個能環(huán)否填入某數(shù)柄,一旦函數(shù)鄰check旗返回0,則勁殺死這個結(jié)香點。鞭如果能一直遷填到最后一蕩個數(shù),結(jié)點翠仍未被殺死扎,則這是一弦個解。景這種思想可旅用偽代碼表津示如下:閑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場o9d普o腎麗bac督ktrac擋k(i,j舒,l);endelse甲Do_端Outpu雁t;費a[i,j核]:=0;波end明;斧注意斜體的怎“貝a[i,j荒]:=0倒”失必不可少!鋒當(dāng)對某個結(jié)律點(x,y帖)擴展的過換程中,可能宇在擴展到(位x+m,y旱+n)時它稠的子樹被完峽全殺死(每竹個結(jié)點都被亮殺死,亦即堡按照(x,抬y)及之前述的填數(shù)方案傾填數(shù),無解善)。這時需左要保證(x頑,y)以后悼所填的數(shù)被并重新置零,樸這個語句的皂作用即在每舊個結(jié)點被殺連死時都將其未置零。徑將偽代碼翻污譯為C++穗代碼:蜜backt輔rack(測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++言)計乒bac他ktrac驗k(i,j堵,l);頓童}家e占lse猜閃outp依ut();痰a盆[i][j誓]=0;評/*Whe桿nfai凡lsan跡dgoe旅supp晴erwar柿ds,t你heva囑luem彼ustb那ecle襖ared*話/}}塑函數(shù)out罰put()魯用雙重循環(huán)乓完成輸出。防在主函數(shù)m緒ain()蜻對back閥track歇(1,1,兔i)進行一繳個循環(huán),i折從1取到9悲,即可完成辦整個程序。櫻運行時發(fā)現(xiàn)搭九宮格的解掏相當(dāng)多,即系使保存到文臺件中也不現(xiàn)咱實。這就回蓄答了第2個次問題。蕩對于第1個藏問題,將這新個程序略加蛙改動,即賦慈予全局?jǐn)?shù)組輛a以初值,拖并在過程b光acktr楚ack中產(chǎn)蒸生下一個i課和j時跳過華有初值的部吼分,即可將威程序轉(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)時)病re服turn(搭0);唇//2極.Che價ckth稱ecol災(zāi)umn墨for爭(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搭]<<"儲";扎cout寫<<end擺l;}}嗽void鮮

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論