pascal编程,有关图的遍历邮递员在送信时,为了节省路途,自己规定:每次总是从n个村子中选择其中一个合适的村子出发,途中每个村子仅且经过一次,送完所有的信.已知各个村子的道路连通情况

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/02 01:25:45
pascal编程,有关图的遍历邮递员在送信时,为了节省路途,自己规定:每次总是从n个村子中选择其中一个合适的村子出发,途中每个村子仅且经过一次,送完所有的信.已知各个村子的道路连通情况

pascal编程,有关图的遍历邮递员在送信时,为了节省路途,自己规定:每次总是从n个村子中选择其中一个合适的村子出发,途中每个村子仅且经过一次,送完所有的信.已知各个村子的道路连通情况
pascal编程,有关图的遍历
邮递员在送信时,为了节省路途,自己规定:每次总是从n个村子中选择其中一个合适的村子出发,途中每个村子仅且经过一次,送完所有的信.已知各个村子的道路连通情况.请你帮邮递员选择一条合适的路线.
输入:
第一行:整数n:村子的个数.
接下来是一个n*n的0、1矩阵,表示n个村子的连同情况,如:a[I,j]=1 ,表示第i和第j个村子之间有路可走,如果a[I,j]=0,表示他们之间无路可走.
输出:一条可行的路线
输入:
7
0 1 0 1 1 0 0
1 0 1 0 1 0 0
0 1 0 0 0 0 1
1 0 0 0 0 0 0
1 1 0 0 0 1 0
0 0 0 0 1 0 1
0 0 1 0 0 1 0
输出:
2 3 7 6 5 1 4
我的程序如下:
const maxn=100;
var a:array[1..maxn,1..maxn]of integer;
visited:array[1..maxn]of 0..1;
b:array[1..maxn] of 1..maxn;
n,m,i:integer; found:integer;
procedure init;
var i,j:integer;
begin
assign(input,'hmdl.in');reset(input);
readln(n);
for i:=1 to n do
for j:=1 to n do read(a[i,j]);
close(input);
end;
procedure print;
var i:integer;
begin
found:=1;
for i:=1 to n-1 do write(b[i],' ');
writeln(b[n]);
end;
procedure dfs(i:integer);
var j,k:integer;
begin
if n=m then print;
for j:=1 to n do
if (a[j,i]=1) and (visited[j]=0) then
begin
visited[j]:=1;
m:=m+1;
b[m]:=j;
dfs(j);
visited[j]:=0;
m:=m-1;
end;
end;
Begin
init;
found:=0;
for i:= 1 to n do
begin
fillchar(visited,sizeof(visited),0);
m:=1;
b[1]:=i;
visited[i]:=1;
dfs(i);
end;
if found=0 then writeln('no road');
end.
我的输出如下,所有可以走的路径:
2 3 7 6 5 1 4
3 7 6 5 2 1 4
4 1 2 3 7 6 5
4 1 2 5 6 7 3
4 1 5 2 3 7 6
4 1 5 6 7 3 2
5 6 7 3 2 1 4
6 7 3 2 5 1 4
怎么控制只输出一条可行的路径就好呢?

pascal编程,有关图的遍历邮递员在送信时,为了节省路途,自己规定:每次总是从n个村子中选择其中一个合适的村子出发,途中每个村子仅且经过一次,送完所有的信.已知各个村子的道路连通情况
在print那个过程里,输出的后面,end;的前面,如果用文件就把文件close掉,然后再打halt;(结束程序)就只会输出一种了.
修改后如下:
procedure print;
var i:integer;
begin
found:=1;
for i:=1 to n-1 do write(b[i],' ');
writeln(b[n]);
halt;
end;