




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PINGDINGSHANUNIVERSITY數(shù)據(jù)結(jié)構(gòu)實(shí)訓(xùn)院(系): 軟件學(xué)院 專業(yè)年級(jí): 軟件工程2009級(jí) 姓 名: 李乾坤 學(xué) 號(hào): 091530108 指導(dǎo)教師: 劉高原講師 2011年06月180查找排序一、 需求分析對(duì)一組無序數(shù)據(jù)進(jìn)行排序,找出排序后某一數(shù)據(jù)所在的位置。二、 概要設(shè)計(jì)略三、 詳細(xì)設(shè)計(jì) 略四、 算法■分析簡(jiǎn)單地說,冒泡法就是先找最小值,再找次小值……,快排則是在一次循環(huán)中使它們局部有序,多次循環(huán),直至全部有序?yàn)橹?。二分查找充分利用了有序序列的特性,從某種意義上講,二分查找側(cè)重的不是比較兩個(gè)敎?zhǔn)遣皇窍嗟?,而是確定要查找的數(shù)的范圍。五、 程序總結(jié)這個(gè)算法給我的最大啟發(fā)就是我們要充分利用已有的信息。比如對(duì)已經(jīng)排好序的數(shù)據(jù)進(jìn)行查找,如果只是平淡的順序查找,就比二分查找的效率低很多。為什么?因?yàn)槎植檎铱紤]并利用了這些信息。同樣的理論還可以用來解釋為什么快排就比冒泡來得快,排序說白了就是為每一個(gè)數(shù)找到一個(gè)它應(yīng)該呆的位置。假如為1~1()排序,冒泡排序說白了就是一開始先找最大值移到最上邊,這沒錯(cuò),關(guān)鍵是次小值又從底部開始找,使以前做的許多移動(dòng)又有一部分重復(fù)了。快排則是,我不管以前怎么著,8碰到5就得放5的右邊這總沒錯(cuò)吧,以后碰到合適的再移動(dòng),但8和5的相對(duì)移動(dòng)不會(huì)再重復(fù)了。由此觀之,消除程序中的重復(fù)工作是提高效率的關(guān)鍵,不過高效率的算法可不是長(zhǎng)在樹上的(說有就有的),比如二分搜索排序,即使看起來很簡(jiǎn)單,能想起來這么做卻是非常不簡(jiǎn)單的。0-1背包問題(Bag)一、 需求分析從若干個(gè)具有一定價(jià)值和質(zhì)量的物品挑出一些放入具有容量限制的背包,使背包的所容納物陽的價(jià)值最大。二、 概要設(shè)計(jì)三個(gè)面板類,用card布局依次顯示
三、詳細(xì)設(shè)計(jì)1)第一個(gè)card負(fù)責(zé)設(shè)置背包容瑩和最大物品個(gè)數(shù)請(qǐng)輸入背包的毘大客量20詰輸入你可臥選擇的粕品個(gè)數(shù)3詰輸入你可臥選擇的粕品個(gè)數(shù)3最犬為20確定上一步下一步2)確定上一步下一步2)第二個(gè)cord負(fù)責(zé)輸入物胎名稱、重瑩、價(jià)格第三個(gè)card顯示結(jié)果四、算法分析本算法的關(guān)鍵長(zhǎng)建立遞歸公式:m[i][j],m[n][j]「m(i,j)= max{m(i+l,j),m(i+l,j-wi)+vi} j>=wi噸][j]=JIm(i+l,j) ()二vjvgm(n,j)=vnj>wi.()=<j<wi算法的主要思路就是將這個(gè)公式程序化,所以說數(shù)學(xué)建模很重要。在這里我覺得最精華的倒不是算法實(shí)現(xiàn),最重要的有兩點(diǎn):一、動(dòng)態(tài)規(guī)劃法的思維方式,這種解題方式可以說是遞歸迭代,也可以認(rèn)為是建了一個(gè)表去記錄已經(jīng)完成的運(yùn)算成果以方便后邊使用,避免重復(fù)運(yùn)算。二、是用一種間接的方式保存被選中的物品,也就是這個(gè)表(m(i,j)),沒有這個(gè)表就沒有這個(gè)算法。五、程序總結(jié)通過完成此次試驗(yàn),對(duì)動(dòng)態(tài)規(guī)劃法感慨良多。()-1背包問題的本質(zhì)就是判斷一個(gè)物品該不該放到背包里,然而這種判斷還依賴于其他物品的選擇,比較方便的方法就是窮舉法,判斷所有可能的狀況,但這樣的效率就太低了。解決一問題總有一個(gè)量來衡量解決這個(gè)問題所需要做的最少工作,編程的一個(gè)目標(biāo)就是如何是計(jì)算機(jī)的效率更好的逼近這個(gè)瑩。研究窮舉法我們會(huì)發(fā)現(xiàn)有很多重復(fù)的運(yùn)算,優(yōu)化窮舉法的重要思路就是利用動(dòng)態(tài)規(guī)劃法的思想:利用已有的成果以避免重復(fù)運(yùn)算,未進(jìn)行的運(yùn)算可以以已進(jìn)行的運(yùn)算為基礎(chǔ)。因此我們必須有一種信息的表示方式來說明這個(gè)運(yùn)算已經(jīng)進(jìn)行過了,反映到敎學(xué)上就是發(fā)現(xiàn)運(yùn)算之間的迭代關(guān)系。我們?cè)購牧硪粋€(gè)角度去理解。吃飯要一口一口的吃,解決問題的一個(gè)重要方法就是縮小問題規(guī)模。如何縮小問題規(guī)模是個(gè)大學(xué)問,我們解決問題一般擷有兩種方法論——遞推和遞歸,遞推在這里很明顯需要大量的回溯,或者直接就是低效率的窮舉法。如果從遞歸方面看,我們先假設(shè)一個(gè)最優(yōu)的結(jié)果,然后再看背包容量減少后的最優(yōu)結(jié)果,這樣一直迭代。算法的設(shè)計(jì)是最費(fèi)腦筋的,但是查看一個(gè)優(yōu)秀的算法非常有助于培養(yǎng)人們靈活的思維方式。最短路徑問題(馬)一、需求分析為用戶提供一種輸入手段獲得一個(gè)無向圖(或鄰接矩陣),出發(fā)點(diǎn)和目的地,通過一定算法得到出發(fā)點(diǎn)到目的地的最短路徑,顯示給用戶。二、概要設(shè)計(jì)三、詳細(xì)設(shè)計(jì)1?數(shù)據(jù)類1) 結(jié)點(diǎn)類Node此類負(fù)責(zé)記錄結(jié)點(diǎn)信息:坐標(biāo)(x,y),結(jié)點(diǎn)名稱,結(jié)點(diǎn)序號(hào)2) 邊類此類負(fù)責(zé)記錄結(jié)點(diǎn)之間連線的信息:起點(diǎn)序號(hào),終點(diǎn)序號(hào),起點(diǎn)和終點(diǎn)的距離我們?cè)谟脩糨斎虢缑嬷薪蓚€(gè)向量對(duì)象,分別是結(jié)點(diǎn)類型和邊類型,當(dāng)新建一個(gè)結(jié)點(diǎn)和邊時(shí),添加到相應(yīng)的向量中。用戶輸入界面(F)用戶界面需要提供一個(gè)面板供用戶畫無向圖,一個(gè)面板為用戶提供畫圖時(shí)的結(jié)點(diǎn)坐標(biāo)、距離、角度等輔助信息,一個(gè)面板供用戶輸入出發(fā)點(diǎn)和目的地。由此將主界面設(shè)計(jì)成中、東、南的BordcrLayout布局。1) 中間的面板類Center因?yàn)橛杏脩舢媹D的需要,所以必須重寫該類的paint方法。該類有兩個(gè)任務(wù):畫結(jié)點(diǎn)(要標(biāo)明結(jié)點(diǎn)名稱)、畫結(jié)點(diǎn)之間的連線(要標(biāo)明結(jié)點(diǎn)距離)。因此該類對(duì)象在執(zhí)行repaint方法前應(yīng)該明確任務(wù)類型(畫點(diǎn)還是畫線),明確需要標(biāo)明的串值,明確結(jié)點(diǎn)坐標(biāo),這也就明確了該類應(yīng)具有的屬性值和方法。2) 東邊的面板類該類只是利用面板的布局作用,故不用單獨(dú)定義。用戶畫無向圖時(shí)需要的輔助信息有:結(jié)點(diǎn)的位置坐標(biāo),一個(gè)結(jié)點(diǎn)相對(duì)于另一個(gè)結(jié)點(diǎn)的距離、角度,連線的起點(diǎn)、終點(diǎn)。于是,我們需要一個(gè)文本框供用戶輸入節(jié)點(diǎn)名稱,記錄節(jié)點(diǎn)個(gè)敎,一個(gè)下拉列表供用戶選擇參照點(diǎn),兩個(gè)文本框顯示未選點(diǎn)到參照點(diǎn)的距離和角度,兩個(gè)下拉列表供用戶選擇起點(diǎn)和終點(diǎn)。這就需要Center對(duì)象監(jiān)聽鼠標(biāo)事件獲取鼠標(biāo)指針的位置,獲取用戶選擇的參照點(diǎn)的位置坐標(biāo),由此得到未選點(diǎn)到參照點(diǎn)的距離和角度。獲取用戶選擇的起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo),以此得到邊的長(zhǎng)度。3) 南邊的面板類該類只是利用面板的布局作用,故不用單獨(dú)定義。我們需要兩個(gè)下拉列表供用戶選擇最短路徑的起點(diǎn)和終點(diǎn),單擊按鈕獲取最短路徑。為了更加的人性化,我們提供取消上一步的功能。取消上一步的功能實(shí)現(xiàn):程序中準(zhǔn)備一個(gè)專門存儲(chǔ)結(jié)點(diǎn)和邊對(duì)象的序號(hào)的向量類,取消上一步時(shí),獲取最后一個(gè)序號(hào),判斷邊類型和節(jié)點(diǎn)類型,根據(jù)該序號(hào)搜索節(jié)點(diǎn)向量和邊向量,得到相應(yīng)的屬性,再用Center類對(duì)象的背景色將該對(duì)象重畫一遍,覆蓋原來的圖形,即可得到取消上一步的效果。同時(shí),在結(jié)點(diǎn)向量和邊向量中去掉取消的結(jié)點(diǎn)對(duì)象或邊對(duì)象。
3、算法類我們從界面類獲得了一個(gè)結(jié)點(diǎn)類型向量,一個(gè)邊類型向量,最短路徑的起點(diǎn)和終點(diǎn)。在該類的構(gòu)造函數(shù)中我們邊向量中的敎據(jù)轉(zhuǎn)換成一個(gè)鄰接矩陣供Floyd算法使用笫4個(gè)結(jié)點(diǎn)名稱:錯(cuò)點(diǎn)位進(jìn):起點(diǎn)經(jīng)點(diǎn)呆短長(zhǎng)度:147連接確定笫4個(gè)結(jié)點(diǎn)名稱:錯(cuò)點(diǎn)位進(jìn):起點(diǎn)經(jīng)點(diǎn)呆短長(zhǎng)度:147連接確定出發(fā)點(diǎn)同耳目的地冋三]|最短翻蠱11馭消上一步四、 算法分析假設(shè)有向圖用鄰接矩陣存儲(chǔ),另外設(shè)置一個(gè)二維數(shù)組A用于存放當(dāng)前頂點(diǎn)之間的最短路徑長(zhǎng)度,分irA[i][j]表示當(dāng)前頂點(diǎn)vi到頂點(diǎn)vj的最短路徑長(zhǎng)度。弗洛伊德的基本思想是遞歸產(chǎn)生一個(gè)矩陣序列AO,A1……Ak……An,其中Ak[i]Q]表示從vi到頂點(diǎn)vj的路徑上所經(jīng)過的頂點(diǎn)編號(hào)不大于k的最短路徑。換句話說Ak[i][j]表示,考慮過點(diǎn)K之后,點(diǎn)i到點(diǎn)j的最短距離。五、 程序總結(jié)通過此次實(shí)驗(yàn),使我明白編程序就像蓋房子,有兩件事非常重要:一、根據(jù)客戶的要求、客戶對(duì)房子的定位設(shè)計(jì)好房子該如何建,這該有什么,那該有什么,即設(shè)計(jì)好房子的圖紙,既要簡(jiǎn)潔美觀又要實(shí)用;二,把圖紙變成實(shí)實(shí)在在的房子。這需要點(diǎn)什么材料,先做什么,后做什么。反映到編程就是,給一個(gè)項(xiàng)目或客戶需求,如何把它編程具有可操作性的系統(tǒng)說明書,如何從理論上實(shí)現(xiàn)這個(gè)項(xiàng)目,這需要較高的系統(tǒng)分析能力。然后具體的編寫程序,這就要求較高的算法能力。此次試驗(yàn),如果單純的借鑒已有的弗洛伊德算法,那么最復(fù)雜的就不是算法實(shí)現(xiàn),而是如何規(guī)范并獲取用戶輸入的信息并將這些信息轉(zhuǎn)換成算法需要的鄰接矩陣。這實(shí)際上是一個(gè)更困難的問題,因?yàn)檫@直接影響了整個(gè)程序的結(jié)構(gòu)。而算法反而居于次要的位置了,因?yàn)椴还艹绦蚪Y(jié)構(gòu)如何,你只要將弗洛伊德算法弄一個(gè)類放在那里即可。經(jīng)濟(jì)學(xué)和歷史上都認(rèn)為,商品交換是現(xiàn)代文明的基礎(chǔ)之一而不是商品生產(chǎn)。如何進(jìn)行信息的交換也是編程的重要問題。很多時(shí)候是數(shù)據(jù)交換決定了該程序的架構(gòu),如何更好的表示信息、組織信息、處理信息實(shí)際上成為了程序的核心工作,也是編程人員應(yīng)該培養(yǎng)的核心能力。算法設(shè)計(jì)對(duì)這樣的能力要求也很高,如果你明白背包問題中如何表示已經(jīng)選中的物品,你基本就了解了解決背包問題算法的一切。Main類??入口packageLI;publicclassMain{publicstaticvoidniain(Strmgaigs[]){newF(”最短路徑問題”);}}主窗口F類packageLI;imponjava.axM.*;imponjava.awt?event.*;imponjava.util.Vector;imponjavax.swiiig.*;classFextendsJFiaineimplementsActionListenei;MouseListenei;MouseMotioiiListenerJtemListener{/**?*/privatestaticfinallongseiialVeisionUID=IL;JPaneleast=nulLsoutli=null;Centercenter=null;JTextFieldtext[]=null;JComboBoxlist[]=null;JButtonedge=nulLbutton=null4eset=null;//iiitx,y4iodeNumber=0,edgeNumbe尸1000,mtx,y,cx=0,cy=0y/參照點(diǎn)坐標(biāo)Strmgstnng=null;Vector<Node>v亡ctoil=null;〃存儲(chǔ)點(diǎn)類型的向量Vectoi<Edge>vector2=null;//存儲(chǔ)邊類型的向量Vector<Iiiteger>recode=null;//取消上一步中存儲(chǔ)點(diǎn)或邊的序號(hào)JLabellabel=null;Cursorcl=null,c2=null;F(Strmgs){〃構(gòu)造函數(shù)super(s);cl=Cuisoi\getPiedefiiieclCursoi(Cuisor.DEFAULT_CURSOR);//默認(rèn)指針c2=Cuisoi.getPiedefiiiedCuisoi(Cuisor.HAND_CURSOR);//手型指針vectoil=newVector<Node>Q;vectoi2=newVector<Edge>Q;recode=newVector<Iiiteger>();text=newJTextField[5];fbr(mti=0;i<5;i-H-){text[i]=newJTextField(8);}Boxbasebox=Box.createVenicalBox();Boxbox[]=newBoxfll];fbr(inti=O;i<ll;i++){box[i]=Box.cieateHoiizontalBox();}list=newJComboBox[5];fbr(inti=0;i<5;i++){list[i]=newJComboBox();}list[O].addItem(H原點(diǎn)(0,0)”);list[O].addltemListener(tliis);Contauiercon=getContentPaiie();//color=con.getBackground();con.setBackground(Colof.cyan);//種花得柳,這樣center顯示出來了centei-newCenter();centei\addMouseListenei(tliis);centeEaddMouseMotionListener(tlus);con.add(centei;BoiderLavout.CENTER);label=newJLabel(-第1個(gè)結(jié)點(diǎn)名稱:”);box[0].add(label);box[0].add(Box.cieateHorizontalStrut(8));box[0].add(text[O]);box[l].add(nexvJLabel("結(jié)點(diǎn)位置:"));//box[1].add(Box.cieateHorizontalStrut(l30));box[2].add(Box.cieateHorizontalStrut(20));box[2].add(newJLabel(”X:”));box[2].add(Box.cieateHorizontalStrut(8));box[2].add(text[1]);box[3].add(Box.cieateHonzontalStRit(20));box[3].add(nexvJLab亡1(”Y:”));box[3].add(Box.cieateHorizontalStrut(8));box[3].add(text[2]);box[4]?add(newJLabel(M參照點(diǎn):”));box[4].add(Box.cieateHorizontalStrut(8));box[4].add(list[O]);box[5].add(newJLabel(M距離"));box[5].add(Box.cieateHorizontalStrut(8));box[5].add(text[3]);box[6].add(newJLabel(”角度"));box[6].add(Box.createHorizontalStnit(8));box[6].add(text[4]);box[7].add(newJLabel("連接起點(diǎn)和終點(diǎn):"));box[7].add(Box.createHorizontalStrut(90));box[8].add(Box.createHorizontalStnit(20));box[8].add(newJLabel(n起點(diǎn)"));box[8].add(Box.createHorizontalStnit(8));box[8].add(list[l]);box[9].add(Box.createHorizontalStmt(20));box[9].add(newJLabel(n終點(diǎn)"));box[9].add(Box.createHorizontalStnit(8));box[9].add(list[2]);edge=newJButton(”連接J;edge.addActioiiListenei(this);box[10].add(edge);basebox.add(Box.createVerticalStmt(20));basebox.add(box[i]);basebox.add(Box.cieateVenicalStmt(10));}east=newJPanelQ;east.add(basebox);con.add(east,BordeiLayout.EAST);south=newJPanelQ;south.add(newJLabel(”出發(fā)點(diǎn)"));soutli.add(list[3]);south.add(newJLabel("§的地”));soutli.add(list[4]);button=newJButton(M最短路徑H);button.addActioiiListener(this);soutli.add(button);reset=newJButton("取消上一步”);//想做到這一點(diǎn)就得來一個(gè)向量記錄點(diǎn)和邊的編號(hào)reset.addActioiiListener(this);soutli.add(reset);con.add(soutlLBoiderLavout.SOUTH);setDefaultCloseOpeiation(JFiame.EXIT_ON_CLOSE);setBounds(400,400,500,500);setVisible(tme);validateQ;publicvoiditemStateChanged(ItemEvente){〃更換參照點(diǎn)的坐標(biāo)if(e.getSourceO=list[0]){mts=list[O].getSelectedIndexO;if(s=O){cx=0;cy=O;cx=vectorl.elementAt(s-1).getX()+5;cy=vectoi1.elementAt(s-1).getY()+5;//加5之后才是圓心〃System?out?pnndnCcx:”+cx+”cyJ+cy);}publicvoidactionPerfbniied(ActioiiEvente){if(e.getSource()=edge){//連接兩個(gè)節(jié)點(diǎn)mts=list[l].getSelectedIiidex();mtd=list[2].getSelectedlndexO;if(s=d){JOptionPane.showMessageDialogtthis,"起點(diǎn)和鄰接點(diǎn)不能相同!","警告對(duì)話框\JOptionPane.^ARNING_.MESSAGE);mtxl=vectoil.elementAt(s).getX();mty1=vector1.elementAt(s).getY();mtal=vectorl.elementAt(d).getX();mtb1=vectoi1.elementAt(d).getY();mtedgeNumbei-vector2.sizeO+1000;//加上1000,作為點(diǎn)和邊的區(qū)別System.out.pimtln(MedgeNumbei—>M+edgeNumber);Edgeedge=newEdge。;edge.setSD(s.d);edge.setNumber(edgeNumbei);recode.add(newIiiteger(edgeNumbei));//edgeNumber++;doubledis=Math.sqrt((x1-a1)*(x1-a1)+(y1-b1)*(y1-b1));mtdistance=newDouble(dis).mtValue()^/只保留double值的整數(shù)部分edge.setDistance(distance);vector2.add(edge);center.setC(Color.black);center.setMode(2);center.setXY(xl,yl);center,setAB(al,bl);center.setStnng(H,,+distance);center.iepamt();}elseif(e.getSourceO=button){//獲取出發(fā)點(diǎn)和目的地,返回最短路徑mts=list[3].getSelectedIiidex();mtd=list[4].getSelectedlndexO;if(s=d){JOptionPane.showMessageDialog(this,"出發(fā)點(diǎn)和目的地不能相同!","警告對(duì)話框\JOptionPane.^ARNING_.MESSAGE);Flovdfloyd=newFloyd(vectorl,vector2,sJ);JOpMonPanushowM亡ssag亡Dialog(this異最短路徑:”+floyd?g亡tLJO+"\n最短長(zhǎng)度:”+floyd?g航Dismnce()昇消息對(duì)?話框HJOptioiiPaiieA\ARNING_MESSAGE);}elseif(e.getSouice()==reset){//取消上一步center.setC(Color.CYAN);if(iecode.size()>0){mtnumbei=recode.lastElement().intValue();//System.out.pimtln(Mnumber->H+number);if(number>=1000){//邊的編號(hào)從1000開始//numbei-number-1000;Edgeed=vector2.elementAt(numbei-1000);mtdis=ed.getDistance();mtxl=vectoil.elementAt(ed.getSource()).getXQ;mtyl=vectoil.elementAt(ed.getSource()).getYQ;mtx2=vectoil.elementAt(ed.getDestination()).getXQ;mty2=vectorl.elementAt(ed.getDestination()).getYQ;center.setMode(2);//模式2為邊,再畫一條和背景色相同的邊centei.setXY(xl,yl);center.setAB(x2,y2);center.setStiing(HH+dis);vector2.lemoveElementAt(number-1000);//邊向量中刪掉這一條邊的數(shù)據(jù)Nodeno=vectorl.elementAt(numbei);mtxO=no.getXQ;mty^no.getYQ;Strmgnaine=no.getName();centei-.setMode(l);//模式1為點(diǎn),再畫一條和背景色相同的點(diǎn)center.setXY(x0,v0);centeLsetStimg(name);vector1.lemoveElementAt(number);//點(diǎn)向量中刪掉關(guān)于這個(gè)點(diǎn)的數(shù)據(jù)label.setText(H第”+(vectOTl.size0+l)+”個(gè)結(jié)點(diǎn)名稱:”);for(uiti=l;i<5;i++){list[i].removeItemAt(number);}list[O].removeIteniAt(number+1);center.repamt();iecode.removeElementAt(recode.size()-l);//刪除最后邊的點(diǎn)或邊的序號(hào)System,out.prmtlii(Hnumber1—>n+number);}elseJOptionPane.showMessageDialog(this,H已取消完畢!警告對(duì)話框\JOptionPane.^ARNING_.MESSAGE);}}publicvoidmousePressed(MouseEvente){〃鼠標(biāo)按下以后x=e.getX()+5;v=e.getY()+5;if(e.getModifiers(尸=Inpi】tEvent?BUTTON1_MASK){//如杲單擊左鍵stimg=text[O].getText();if(stimg.equals(,M,)){JOptioiiPane.showMessageDialog(tliis,H請(qǐng)輸入結(jié)點(diǎn)名稱!警告對(duì)話框\JOptionPane.^ARNING_.MESSAGE);Nodenode=newNode();node.setLocation(x,y);node.setName(stiing);intnodeNumbei-vectorl.sizeQ;System.out.piintlii(HnodeNumber->n+nodeNumbei);node.setNumbei(nodeNuniber);iecode.add(newIntegei(nodeNumber));vectorl.add(node);center.setC(Color.black);center.setMode(l);center.setXY(x,y);center.setString(string);center.iepamt();foi(inti=0;i<5;i++){list[i].addltem(struig);//nodeNumber++;text[O].setText(HH);label.setText(n第H+(nodeNumber+2)+n個(gè)結(jié)點(diǎn)名稱J;}}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEnteied(MouseEvente){}publicvoidmouseExited(MouseEvente){〃鼠標(biāo)離開以后setCuisor(cl);}publicvoidmouseClicked(MouseEvente){}publicvoidmouseDragged(MouseEvente){}publicvoidmouseMoved(MouseEvente){〃鼠標(biāo)在Center類上移動(dòng)setCursor(c2);mtx0=e.getX0+5;mtvO=e.getY()+5;doubledis=Math.sqrt((xO-cx)*(xO-cx)+(yO-cy)*(yO-cy));intdistance=newDouble(dis).mtValue();//只保留double值的整數(shù)部分text[l].setText(HH+xO);text[2].setText(,H,+yO);text[3].setText("H+distance);text[4].setText(,,H+f1(xO,yO,cx,cy));}publicmtfl(mtxO,mtvOjntcxantcy){//根據(jù)所給的臨邊和對(duì)?邊的起點(diǎn)和終點(diǎn)坐標(biāo)得到角度doubleansle=0;mtjiaodu=0;angle=Math.atan2(cy-yTO,xO-cx);//兩個(gè)參數(shù)分別為鄰邊、對(duì)■邊ansle=aiisle*180/Math.PI;jiaodu=newDouble(angle).mtValue();//只保留double值的整數(shù)部分returnjiaodu;}}點(diǎn)類Node,存放結(jié)點(diǎn)的一些信息packageLI;classNode{Stimgname=null;mtx,y,number;publicvoidsetName(Stimgname){=name;publicvoidsetLocation(inta,iiitb){x=a;y=b;publicStimggetNanie(){returnname;publicmtgetX(){returnx;publicmtgetY(){returny;}publicvoidsetNumber(iiitn){numbei-n;publicmtgetNumber(){returnnumber;}邊類:Edge,存放邊的一些信息packageLI;classEdge{mtsouice=0,destination=0,distance=0.numbei-0;〃為了不讓點(diǎn)和邊的number混淆,我們將邊的number的基數(shù)設(shè)為1000publicvoidsetSD(mts.iiitd){souice=s;destmation=d;publicmtgetSouice(){returnsource;publicmtgetDestmation(){returndestmation;publicvoidsetDistance(mtdis){distance=dis;publicmtgetDistance(){returndistance;publicvoidsetNumber(iiitnunibei){tlus.numbei-number;}Center類,主窗口負(fù)責(zé)繪制無向圖的類packageLI;importjava.axM.Color;importjava.axM.Graphics;importjavax.swmg.JPanel;classCenterextendsJPanel{privatestaticfinallongseiialVersionUID=IL;mtx,y,mode,a.b,xi,yi;Stimgsumg=HM;Colorcoloi-Colorblack;Center(){setBackground(Color.cyan);}publicvoidsetC(Colorc){coloi-c;publicvoidsetXY(intx.mty){this.x=x;tlus.y=y;}publicvoidsetAB(inta.mtb){tlus.a=a;tlus.b=b;}publicvoidsetStnng(Strmgstr){strmg=str;}publicvoidsetMode(mtm){mode=m;}publicvoidpaint(Grapliicsg){g.setColoi(color);if(mode==l){//模式為1時(shí)畫點(diǎn)g.fillOval(x,y,10,10);g.diawStimg(stimg,x,y);}elseif(mode==2){//模式為2時(shí)畫邊g.diawLme(x+5,y+5、a+5,b+5);//加5是為了讓其畫到圓心g.diawStimg(stfmg,(x+a+10)/2,(y+b+10)/2);}}嚴(yán)voidf(){doubleangleO.angle1.angle2Jcl,k2;//kO=(b-y)/(a-x);angleO=Math.ataii2(y-b,a-x)*180/Matli.PI;angle1=angle0+20;aiigle2=anglel-20;k1=Math.tan(angle1);doublek;k=(b-y)/(a-x);}*//*publicvoidupdate(Giaplucsg){//g.clearRect(x,y.width,height);paint(g);}*/〃如何畫箭頭:1得到斜線的斜率2得到該斜線的角度3得到箭頭兩條線的角度〃假設(shè)是204得到兩條線角度tan植5得到兩個(gè)點(diǎn)〃能畫箭頭就可以得到有向圖}算法類:FloydpackageLI;importjava.util.Vector;classFloyd{Vector<No
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)水平葉片過濾機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)橡膠絕緣套數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 第1章 有理數(shù) 小結(jié) 教學(xué)設(shè)計(jì) -2024-2025學(xué)年浙教版(2024)七年級(jí)數(shù)學(xué) 上冊(cè)
- 第八章第三節(jié)《撒哈拉以南非洲》教學(xué)設(shè)計(jì)-2023-2024學(xué)年魯教版五四制六年級(jí)地理下冊(cè)
- 機(jī)械原理 CH03學(xué)習(xí)資料
- Unit 4 第3課 Project &Reflecting 教學(xué)設(shè)計(jì) 2024-2025學(xué)年人教版英語七年級(jí)上冊(cè)
- 2025年度解除技術(shù)合作項(xiàng)目的聲明文件
- 二零二五年度婚姻家庭財(cái)產(chǎn)分配與子女成長(zhǎng)協(xié)議
- 二零二五夫妻財(cái)產(chǎn)協(xié)議書-家庭財(cái)富管理與婚姻穩(wěn)定
- 二零二五年度帶車司機(jī)勞務(wù)管理與車輛使用合同
- 規(guī)?;i場(chǎng)生物安全
- 維修基金使用合同范例
- c語言課件教學(xué)下載
- 2024購房合同購房定金合同
- 2024年全國(guó)中學(xué)生生物學(xué)聯(lián)賽試題含答案
- 高速公路施工現(xiàn)場(chǎng)安全管理制度
- 5.3應(yīng)用二元一次方程組-雞兔同籠教學(xué)設(shè)計(jì)-北師大版八年級(jí)數(shù)學(xué)上冊(cè)
- 加油站防雷、防靜電自查自糾方案
- 2024年中國(guó)解剖臺(tái)市場(chǎng)調(diào)查研究報(bào)告
- 第四單元平行與相交(單元測(cè)試)-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)青島版
- 2024年密碼行業(yè)職業(yè)技能競(jìng)賽參考試題庫500題(含答案)
評(píng)論
0/150
提交評(píng)論