古詩詞大全網 - 四字成語 - 什麽是“壹筆畫問題”?

什麽是“壹筆畫問題”?

壹筆畫問題

數學家歐拉曾經解決過著名的七橋問題(七橋圖見圖1.3-5 ⑴圖)。下面寫出七橋問題的描述:城市中有壹條河,河中有A、D兩個島,河上有七座橋來連接兩個島及河的B、C兩岸,問:⑴能否剛好經過每座橋壹次,既無重復也無遺漏?⑵能否經過橋壹次後又回到原來出發點上來?

圖1.3-5

七橋問題可以畫成圖1.3-5中的⑵圖的形式,這樣七橋問題的第壹問就轉化成了能否壹筆畫成壹個圖的問題。

壹個圖能否壹筆畫成需要滿足以下條件:先根據圖的鄰接矩陣求出每個頂點的度數。如果沒有度數為奇數的頂點,則可以從任壹點開始壹筆畫成壹個圖。如果有兩個度數為奇數的頂點,則可從這兩個奇數頂點中的任壹點開始壹筆畫成壹個圖。如果度數為奇數的頂點超過兩個,則這個圖不能夠壹筆畫出。

圖1.3-6

對於圖1.3-5的⑵圖或是1.3-6所示的無向圖,可以用數組graph存儲圖的鄰接矩陣,用數組degree存儲每個頂點的度數,用變量Total_d存儲總的度數,用變量Odd_num存儲度數為奇數的頂點個數,用變量start存儲壹筆畫的起始頂點。

壹筆畫程序如下:

program stroke(input,output);

var graph:array[1..20,1..20] of 0..1;

degree:array[1..20] of integer;

odd_num,vn,vi,vj,start,total_d:integer;

begin

odd_num:=0;total_d:=0;start:=1;

write('please input the number of vertex:');

readln(vn);

writeln('please input the data:');

for vi:=1 to vn do

begin

degree[vi]:=0;

for vj:=1 to vn do

begin

read(graph[vi,vj]); {讀入鄰接矩陣}

degree[vi]:=degree[vi]+graph[vi,vj]{求每個頂點的度數}

end;

total_d:=total_d+degree[vi]; {求總的度數}

if odd(degree[vi]) then 

begin

odd_num:=odd_num+1; {統計奇數頂點的個數}

start:=vi  {確認從奇數頂點出發}

end

end;

if odd_num>2 then writeln('no solution'){奇數頂點超過兩個顯示無解}

 else

begin

write('the road is: ',start); 

vi:=0;

while total_d>2 do

begin

repeat vi:=vi+1 until graph[start,vi]<>0;{找連接的相鄰點}

if degree[vi]>1 then {先畫度數大於1的頂點}

begin

write('->',vi);

graph[start,vi]:=0;

graph[vi,start]:=0;

degree[vi]:=degree[vi]-1;

degree[start]:=degree[start]-1;

total_d:=total_d-2;

start:=vi;

vi:=0

end

end;

repeat vi:=vi+1 until graph[start,vi]<>0; {確認最後壹筆}

writeln('->',vi)

end

end.

輸入圖1.3-6所示的無向圖,程序運行結果如下:

please input the number of vertex:6

please input the data:

0 1 1 0 0 0

1 0 1 1 0 1

1 1 0 0 1 1

0 1 0 0 1 1

0 0 1 1 0 1

0 1 1 1 1 0

the road is: 5->3->1->2->3->6->2->4->5->6->4

巴蜀