作者bleed1979 (十三)
站内Programming
标题Re: [问题] 递回改非递回
时间Thu Apr 15 15:58:02 2010
以往我也是递回写,突然要搞非递回有点遇到困难的感觉。
不过设定好该保留每个数选择下一个数的阵列(pos)也是可以办到。
另外要说明一下有些人觉得要怎麽跳出回圈。
因为是一笔划,输出答案的长度是9位数,index 会从0到8。
如果不合会减1,那跳出回圈就是index减到 < 0。看程式码就很容易了解了。
UVa那里只需要0开头即可。有兴趣也可以包一个外回圈改成0到4所有开头都跑。
以下程式已经测试通过,仅供参考。
Bleed
#include <iostream>
using namespace std;
unsigned int adj[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}};
unsigned int pos[8][5];
int main()
{
unsigned int answer[9], now = 0;
int x = 0;
while (true)
{
answer[x] = now;
if (x == 8)
{
for (unsigned int i = 0; i != 9; ++i)
cout << answer[i] + 1;
cout << "\n";
if (x > 0)
{
++adj[answer[x - 1]][now];
++adj[now][answer[x - 1]];
}
--x;
now = answer[x];
}
unsigned int j;
for (j = pos[x][now]; j != 5; ++j)
if (adj[now][j] > 0)
{
--adj[now][j];
--adj[j][now];
pos[x][now] = j + 1;
now = j;
break;
}
if (j == 5)
{
if (x > 0)
{
++adj[answer[x - 1]][now];
++adj[now][answer[x - 1]];
}
pos[x][now] = 0;
--x;
if (x < 0)
break;
now = answer[x];
}
else
++x;
}
return(0);
}
※ 引述《remember11 (纪元)》之铭言:
: 如题
: 这是题目的网址
: 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: 114.32.177.97