作者remember11 (紀元)
看板Programming
標題[問題] 遞迴改非遞迴
時間Sun Apr 11 23:27:21 2010
如題
這是題目的網址
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
推 yauhh:真的蠻難的.先說第二個,把map陣列重新放回1218.160.213.121 04/12 01:24
→ yauhh:就是要準備個stack讓挑走的格數暫存又取回..218.160.213.121 04/12 01:25
→ yauhh:而因為程式是在map矩陣挑走格數又塞回格數,218.160.213.121 04/12 01:29
→ yauhh:map的狀態不會是主要的終止條件.218.160.213.121 04/12 01:29
→ yauhh:最後的for迴圈可以取出來做主要的5x5迴圈,218.160.213.121 04/12 01:30
→ yauhh:迴圈中要挑走map矩陣,挑完的時候印出來,218.160.213.121 04/12 01:32
→ yauhh:挑過的格數暫存在stack,等做完時取回.218.160.213.121 04/12 01:33
→ yauhh:真難轉換,好希望能想出系統化的轉換方法.218.160.213.121 04/12 01:34
推 march20:只好暴力跳出 loop 再重新進入了 XD 66.75.255.220 04/12 04:44
推 march20:然後全部的變數都放進 stack XD 66.75.255.220 04/12 04:45
→ brianhsu:用迴圈自己 maintain stack。XD 114.32.42.74 04/12 07:39
推 cooljony0109:用stack != NULL 當終止條件 163.13.127.179 04/12 14:25
→ cooljony0109:不知道可不可行!? 163.13.127.179 04/12 14:26