作者laa7352 (Laa)
看板Fortran
标题Re: [问题] 小题目:各点之间的最小连结步数
时间Fri Nov 6 05:39:20 2009
※ 引述《yin0416 (冷色铅笔)》之铭言:
: 假设有N个点,每个点相互之间有些有连结,有些没有连结。
: 给你一个N乘N的矩阵,代表每个点相互之间连结的有或无。
: 请算出每个点与点之间的最小连结步数,
: 例如点1与点2有连结,点2与点3之间有连结,而点1与点3之间没有直接连结,
: 则点1与点3之间的最小连结步数即为2步。
: 老师并不要求我写出来,所以我不是为了应付作业而来发问的。
: 这个程式的结构我想了很久,但没有想出来。
无聊乱写的…
假设有九个点,各点连接的情形如下
1 : 3 5 7 9
2 : 4 6
3 : 1 6 8
4 : 2 5 7
5 : 1 4
6 : 2 3 7 9
7 : 1 4 6
8 : 1 3
9 : 1 6
现在找点2连接到点9的路径
程式如下
跑到第二层就有结果
2 6 9 (其实目视就可以看出来了XD)
第三层之後我就懒得写了
整个结构只是一直不断的代换
我想应该会有比较简单的写法
integer var,nvar,np,ivar,ip,nstart,nend,link
integer ip2,ip3,ip4
integer itemp,itemp2,itemp3
integer ilink
character cf*7
parameter(nvar=9,np=5)
dimension var(np,nvar),link(np)
data var /3,5,7,9,0, !把点连接情形输入到阵列中
2 4,6,0,0,0, !var(np,nvar)中的np是指共连接了几个点
3 1,6,8,0,0, !nvar是指共有几个点
4 2,5,7,0,0, !在阵列中的整数值,代表的是二点之间有连线
5 1,4,0,0,0, !ex:var(3,1)=7,指点1跟点7有连线
6 2,3,7,9,0, ! var(2,3)=6,指点6跟点3有连线
7 1,4,6,0,0, !而0代表的是没有资料(没有连线)
8 1,3,0,0,0,
9 1,6,0,0,0/
nstart=2 !开始的点
nend=9 !结束的点
cf='( I2)'
c==== !第一层开始
ip=0
11 ip=ip+1
ilink=1
link(1)=nstart
if(ip .gt. np)goto 12
itemp=var(ip,nstart)
if(itemp .eq. 0)goto 12
if(itemp .eq. nstart)goto 11
if(itemp .eq. nend)then
ilink=2
link(ilink)=nend
write(cf(2:2),'(I1)')ilink
write(*,cf)(link(i),i=1,ilink)
goto 11
else
c !第二层
print*, itemp
ip2=0
21 ip2=ip2+1
ilink=2
link(ilink)=itemp
if(ip2 .gt. np)goto 22
itemp2=var(ip2,itemp)
if(itemp2 .eq. 0)goto 22
if(itemp2 .eq. nstart)goto 21
if(itemp2 .eq. nend)then
ilink=3
link(ilink)=nend
write(cf(2:2),'(I1)')ilink
write(*,cf)(link(i),i=1,ilink)
goto 21
else
!
! !放第三层…
!
endif
goto 21
22 continue
endif
c !第二层结束
goto 11
12 continue
c==== !第一层结束
stop
end
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.228.145.72
1F:→ yin0416:问题是,我要处理的点有49个~~~ 11/06 11:02