全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1320
推到 Plurk!
推到 Facebook!

找圖上任意兩點間的某長度\路徑

尚未結案
spring1201
一般會員


發表:3
回覆:1
積分:0
註冊:2010-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-23 01:24:43 IP:114.44.xxx.xxx 訂閱
小弟是程式新手,最近自學c++一陣子
最近用dev c寫了一個程式,就是給一個圖然後找出任意兩點間某長度所有的路徑
小弟的圖是以一維陣列表示如下:
int node[80]={0,1,2,4,8,
1,0,3,7,11,
2,0,3,6,10,
3,1,2,5,9,
4,0,5,6,12,
5,3,4,7,15,
6,2,4,7,14,
7,1,5,6,13,
8,0,9,10,12,
9,3,8,11,15,
10,2,8,11,14,
11,1,9,10,13,
12,4,8,13,14,
13,7,11,12,15,
14,6,10,12,15,
15,5,9,13,14};

這是一個圖有16個點,0~15,每個點都有4個相鄰點
0,1,2,4,8, 這表示0這點有1,2,4,8,這4個相鄰點
小弟是用暴力法去寫,可能有地方寫錯
所以我的程式只能跑出部分路徑,但一直找不出問題所在
請大大给我指教,或是有什麼比較好的想法,謝謝
附加檔案:4bf8135b14eab_graph.cpp
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-26 15:26:16 IP:61.219.xxx.xxx 訂閱
好久沒寫遞回~
step0中沒有把一找到相鄰點為終點就結束,造成只有最後一個(for迴圈)相鄰點為終點才會結束 (我想這應該不是你想要的結果)
step0如下紅字修改,另外step1和mod兩各function完全不需要,直接註解即可

補充,此程式不是找最少節點數路徑,例s=1,d=5,1->0->2->3->5,最少節點路徑1->7->5

void step0(int s,int d,int path[100]){
int i,k,q;
k=now(path);
for(i=0;i<80;i ){
if(node[i]==s && i%5==0){//找到起點
break;
}//找到起點
}

//if(node[q]==d){//相鄰點為終點
// output(path);//輸出陣列
//step1(d,q,path);//找下個相鄰點
//break;
//}
//else{

step0(node[q],d,path);//繼續往下找
break;
//n=mod(path[k-1],path[k]); //不需要
path[k]=-1;
//step1(d,n,path); //不需要
}
}


我的寫法...大同小異,參考看看~
#define MAXPOINT 16
int getpath(int start,int dest,int* path,int& count)
{
int result = -1;
path[count] = start;
count ;
//檢查該節點連結的節點是否有dest
for (int i=1;i<=4;i )
{
if (dest == node[start*5 i])
{
result = dest;
path[count] = dest;
count ;
return result;
}
}
//以該節點連結的節點繼續尋找
for (int i=1;i<=4;i )
{
//檢查是否已走過
bool go_next = false;
for (int j=0;j {
if (node[start*5 i]==path[j]) //重覆path
{
go_next = true;
break;
}
}
if (go_next) continue; //以下不執行,for next
//設定走下各節點
if (dest == getpath(node[start*5 i],dest,path,count))
{
result = dest;
break;
}
else
count--; //若此節點走下去無對應則退回一個path點
}
return result;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//設定
int start = Edit1->Text.ToInt(); //0~15
int dest = Edit2->Text.ToInt(); //0~15
int *path = new int[MAXPOINT];
for (int i=0;i path[i]=-1;
//開始
int count = 0;
if (-1 == getpath(start,dest,path,count))
ShowMessage("找不到路徑");
//show
Memo1->Clear();
for (int i=0;i {
Memo1->Lines->Add(path[i]);
}
delete path;
}



編輯記錄
senso 重新編輯於 2010-05-26 15:28:18, 註解 無‧
senso 重新編輯於 2010-05-26 15:29:30, 註解 無‧
senso 重新編輯於 2010-05-26 15:42:46, 註解 無‧
senso 重新編輯於 2010-05-26 15:51:17, 註解 無‧
spring1201
一般會員


發表:3
回覆:1
積分:0
註冊:2010-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-05-26 23:43:37 IP:114.44.xxx.xxx 訂閱
前輩你好
我有照你的的意見去修改
但還是無法跑出兩點間的所有可能路徑
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-05-28 09:13:28 IP:61.219.xxx.xxx 訂閱
因為我output用別的方式顯示,
原本的output的if(i==7)要做什麼?應該不用吧?
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-06-01 16:29:47 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-04-19 21:13:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!