[問題] 遞迴改非遞迴

看板Programming作者 (紀元)時間15年前 (2010/04/11 23:27), 編輯推噓4(409)
留言13則, 4人參與, 最新討論串1/4 (看更多)
如題 這是題目的網址 http://uva.onlinejudge.org/external/2/291.html 這是ACM的競賽題目 (一筆劃問題) 下面的程式碼是老師給的 c語言code 老師要我們把它從"遞迴"改成"非遞迴" 因為小弟才疏學淺+遞迴很少用... 我大概改了兩個版本都失敗 我遇到了兩個問題 ●找不到結束的條件式//要把所有的可能找出來 ●無法將map陣列重新放回1 /* map[now][a]=1; map[a][now]=1; */ 不知道有沒有大大可以指點思考一下方向 //---------------------------------------- #include<stdio.h> #include<stdlib.h> int map[5][5]={ 0,1,1,0,1, 1,0,1,0,1, 1,1,0,1,1, 0,0,1,0,1, 1,1,1,1,0}; int tryway[9]={0}; void make(int now,int go) { int a,b,sum=0; tryway[go]=now; for(a=0;a<5;a++) for(b=0;b<5;b++) sum=sum+map[a][b]; if(sum==0) { for(a=0;a<9;a++) printf("%d",tryway[a]+1); printf("\n"); } for(a=0;a<5;a++) if(map[now][a]==1&&a!=now) { map[now][a]=0; map[a][now]=0; make(a,go+1); map[now][a]=1; map[a][now]=1; } } main() { make(0,0); system("pause"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.13.127.188

04/12 01:24, , 1F
真的蠻難的.先說第二個,把map陣列重新放回1
04/12 01:24, 1F

04/12 01:25, , 2F
就是要準備個stack讓挑走的格數暫存又取回..
04/12 01:25, 2F

04/12 01:29, , 3F
而因為程式是在map矩陣挑走格數又塞回格數,
04/12 01:29, 3F

04/12 01:29, , 4F
map的狀態不會是主要的終止條件.
04/12 01:29, 4F

04/12 01:30, , 5F
最後的for迴圈可以取出來做主要的5x5迴圈,
04/12 01:30, 5F

04/12 01:32, , 6F
迴圈中要挑走map矩陣,挑完的時候印出來,
04/12 01:32, 6F

04/12 01:33, , 7F
挑過的格數暫存在stack,等做完時取回.
04/12 01:33, 7F

04/12 01:34, , 8F
真難轉換,好希望能想出系統化的轉換方法.
04/12 01:34, 8F

04/12 04:44, , 9F
只好暴力跳出 loop 再重新進入了 XD
04/12 04:44, 9F

04/12 04:45, , 10F
然後全部的變數都放進 stack XD
04/12 04:45, 10F

04/12 07:39, , 11F
用迴圈自己 maintain stack。XD
04/12 07:39, 11F

04/12 14:25, , 12F
用stack != NULL 當終止條件
04/12 14:25, 12F

04/12 14:26, , 13F
不知道可不可行!?
04/12 14:26, 13F
文章代碼(AID): #1BmUfSiv (Programming)
文章代碼(AID): #1BmUfSiv (Programming)