哈密尔计划;使用crt;(*******************大整数的表示:**********)CONST数字=8;(*位数*3=用于计数的最大位数*)TYPE count_t=字的数组[1..位数];程序赋值(VAR c,s:count_t);VAR i:字节;开始对于i:=1 TO数字DO c[i]:=s[i];结束;PROCEDURE assign_word(VAR c:count_t;w:word);VAR i:字节;开始c[1]:=w;对于i:=2 TO数字DO c[i]:=0;结束;程序print_count(c:count_t);VAR i:字节;f:布尔值;开始f:=真;对于i:=数字DOWNTO 1如果f,则执行然后如果(c[i]=0)和(i<>1)然后写入('')ELSE起点写入(c[i]:3);f:=错误结束ELSE写入(c[i]DIV 100,(c[i]DIV 10)模块10,c[i]MOD 10);结束;VAR carry_error:布尔值;PROCEDURE add_to(VAR sum,add:count_t);VAR i:字节;携带:单词;开始进位:=0;对于i:=1 TO数字开始吧总和[i]:=总和[i]+加法[i]+进位;IF总和[i]>999然后开始总和[i]:=总和[i]-1000;进位:=1;结束ELSE进位:=0;结束;IF进位>0THEN carry_error:=真;结束;(*******************构成**************)CONST公司tsize=8;湿疹1=7;类型num=1..tize;numm1=1…tsizem1;(******************预状态************)VAR(无功功率)角点:字节数组[num];size,sizem1:字节;pre_state:布尔数组[num];not_fixed:布尔数组[num];程序init_pre_state;VAR i:num;开始对于i:=1 TO尺寸开始吧预状态[i]:=角[i]=0;不固定[i]:=角[i]=1;结束;结束;函数no_next_pre_state:布尔值;VAR i:字节;go:布尔值;开始i:=0;go:=真;随时随地(i<大小)开始吧包括(i);如果未修复[i]然后如果pre_state[i]然后预状态[i]:=假ELSE go:=错误结束;如果不去然后预状态[i]:=真;no_next_pre_state:=开始结束;(****************桥*************)VAR(无功功率)桥接:布尔数组[numm1];程序init_bridge;VAR i:num;开始对于i:=1至尺寸1DO桥[i]:=假结束;函数no_next_bridge:布尔值;VAR i:字节;go:布尔值;开始i:=0;go:=真;执行AND时(i<sizem1)开始吧包括(i);中频电桥[i]THEN桥[i]:=假ELSE go:=错误结束;如果不去THEN桥[i]:=真;no_next_bridge:=开始结束;(*****************州************)TYPE t_state_repr=字节数组[num];类型p_state=^t_state;p_bridge=^t_bridge;t_state=记录报告:t_state_repr;桥:p_bridge;旧_ c,new_c:count_t;下一个:p_state;结束;t_bridge=记录from_state:p_state;下一步:p_bridge;结束;VAR所有状态:p_state;状态数,当前状态编号,nr_bridges:整数;程序init_all_states;VAR i:字节;开始nr_states:=1;nr_bridges:=0;cur_state_nr:=0;新建(所有状态);具有所有状态(_S)^开始吧对于i:=1 TO尺寸DO代表[i]:=0;桥梁:=无;下一个:=无结束;结束;函数compair(a,b:t_state_repr):布尔值;VAR i:字节;eq:布尔值;开始等式:=真;i:=0;当(i<尺寸)和eq开始吧包括(i);等式:=a[i]=b[i];结束;比较:=eq;结束;PROCEDURE add_connection(旧状态:p_state;新状态报告:t_state_repr);VAR参考状态:p_state;桥接:p_bridge;开始inc(nr桥);ref_state:=所有状态;WHILE(非compair(ref_state ^.repr,new_state_rerepr))AND(参考状态^.下一个<>NIL)DO ref_state:=ref_state ^.next;IF(非压缩(ref_state^.repr,new_state_repr))然后开始inc(国家注册号);新建(ref_state ^.next);ref_state:=ref_state ^.next;ref_state ^.repr:=新状态repr;ref_state桥梁:=无;ref_state ^.下一个:=无;结束;新建(桥梁);bridge ^.next:=参考状态^.bridges;桥^.from_state:=旧状态;ref_state ^.bridges:=桥;结束;VAR状态:t_state_repr;(*代表van huidige州*)程序print_state;VAR i:字节;开始对于i:=1 TO尺寸开始吧gotoxy(1,2*i);IF状态[i]>0然后写入(“--”,状态[i],“--”);结束;结束;程序print_bridge;VAR i:字节;开始对于i:=1至尺寸1开始吧gotoxy(8,2*i+1);中频电桥[i]然后写入('|');结束;结束;函数bridge_fits_to_state{桥,状态}:布尔值;VAR i,c:字节;正确:布尔值;开始{clrscr;}{打印状态;}{打印桥;}{gotoxy(1,19);}{写入('bridge_fits_to_state');}正确:=真;i:=0;c:=0;当(i<尺寸)和正确开始吧包括(i);IF(c>0)AND(状态[i]>0)AND((c=状态[i])OR((i<大小)AND桥接器[i])然后正确:=错误ELSE IF(i<sizem1)与桥[i]THEN IF状态[i]>0然后c:=状态[i]如果c=0,则为ELSE则c:=255ELSE公司ELSE c:=0结束;{如果正确然后写(“正确”)ELSE写入(“不正确”);}{重复,直到读键<>#0;}bridge_fits_to_state:=正确;结束;程序print_corners;VAR i:字节;开始对于i:=1 TO尺寸开始吧gotoxy(8,2*i);书写(角[i]);结束;结束;PROCEDURE make_corners{state,bridge->corners};VAR i:字节;开始对于i:=1 TO尺寸DO IF状态[i]>0然后角[i]:=1ELSE角[i]:=0;对于i:=1至尺寸1DO IF桥[i]然后开始inc(转角[i]);inc(转角[i+1]);结束;{打印角;}结束;程序打印状态;VAR i:字节;开始对于i:=1 TO尺寸开始吧gotoxy(10,2*i);IF预状态(_S)[i]然后写('----');结束;结束;VAR新状态:t_state_repr;程序print_new_state;VAR i:字节;开始对于i:=1 TO尺寸开始吧gotoxy(13,2*i);如果新状态[i]>0然后写入(新状态[i]);结束;{重复,直到读键<>#0;}结束;PROCEDURE遍历{state,bridge,corners}(VAR p,mark:byte);VAR j:整数;扫描,未找到:布尔值;开始扫描:=真;inc(标记);WHILE扫描开始吧IF(p>1)AND(桥接[p-1])然后(p>1)和桥接[p-1]开始吧dec(p);inc(标记);结束ELSE IF(p<大小)与桥[p]然后(p<尺寸)和桥接[p]开始吧inc(p);inc(标记);结束;IF状态[p]>0然后开始j:=0;not_found:=真;WHILE(j<大小)AND not_found开始吧inc(j);IF(p<>j)AND(状态[p]=状态[j])THEN not_found:=假;结束;如果未找到(_F)然后扫描:=假ELSE起点p:=j;inc(标记);结束;IF角[p]=1然后扫描:=假;结束ELSE扫描:=FALSE;结束;结束;函数make_new_state{state,bridge,pre_state->new_state}:boolean;VAR i,v,p,标记,显示:字节;开始{gotoxy(1,21);}{写入('make_new_state');}对于i:=1 TO尺寸DO新状态[i]:=0;v:=0;标记:=0;显示:=0;对于i:=1 TO尺寸如果预状态[i]与(新状态[i]=0),则执行DO然后开始包括(v);新状态[i]:=v;p:=i;步行(p,mark);如果(new_state[p]=0)AND pre_state[p]那么new_state[p]:=vELSE公司(disp);结束;IF标记>0然后make_new_state:=(mark=size)AND(disp<=2)ELSE IF桥[1]然后开始dec(角[1]);dec(角[2]);桥[1]:=假;p:=1;步行(p,mark);如果p=2然后make_new_state:=假ELSE起点p:=2;步行(p,mark);make_new_state:=标记=大小结束;桥接[1]:=真;inc(角[1]);inc(角[2]);结束ELSE起点p:=1;步行(p,mark);make_new_state:=标记=大小;结束;{打印新状态;}{gotoxy(1,22);}{write('(marked=',mark,',disp=',disp,')');}{重复,直到读键<>#0;}结束;程序打印状态(walk_state:p_state);VAR b:p_bridge;i:字节;nr:整数;程序new_line;开始inc(nr);如果nr<21然后写ELSE起点数量:=2;书写;写入('按更多信息。’);重复,直到读键<>#0;gotoxy(1,wherey);氯雷醇;结束结束;开始clrscr;高视频;写入(“抓地机”);gotoxy(1,24);writeln('(“…a…->b”表示存在规则a->a b)');北欧视频;窗口(1,2,79,23);数量:=1;WHILE walk_state<>无开始吧b:=walk_state桥梁;当b<>无开始吧如果其中x>78-尺寸然后开始new_line;写入(“”:大小,“”);结束;对于i:=1 TO尺寸开始吧写入(b^.from_state^.repr[i]);结束;b:=b^.下一个;写入(“”);结束;如果其中x>75-尺寸然后开始new_line;写入(“”:大小,“”);结束;写入('->');带walk_state^开始吧对于i:=1 TO尺寸写(repr[i]);结束;new_line;walk_state:=walk_state^.next;结束;窗口(1,1,80,24);gotoxy(1,24);氯雷醇;结束;程序print_connection;VAR i:字节;开始对于i:=1 TO尺寸开始吧gotoxy(1,i*2+4);IF状态[i]=0然后写入('+')ELSE写入('-(',state[i],')-+');如果新状态[i]=0然后写入(“”)ELSE写入('--(',new_state[i],')--');如果i<大小然后开始gotoxy(8,i*2+5);中频电桥[i]然后写入(“|”)ELSE写入(“”)结束结束结束;(****************计数***************)PROCEDURE init_counting(walk_state:p_state);开始赋值字(walk_state ^.old_c,1);赋值字(walk_state ^.new_c,0);walk_state:=walk_state^.next;WHILE walk_state<>无开始吧赋值字(walk_state ^.new_c,0);赋值字(walk_state ^.old_c,0);walk_state:=walk_state^.next;结束;结束;PROCEDURE pre_next_step(walk_state:p_state);开始赋值字(walk_state ^.old_c,0);赋值字(walk_state ^.new_c,0);walk_state:=walk_state^.next;WHILE walk_state<>无开始吧赋值(walk_state ^.old_c,walk_state ^.new_c);赋值字(walk_state ^.new_c,0);walk_state:=walk_state^.next;结束;结束;PROCEDURE next_step_counting(walk_state:p_state);VAR b:p_bridge;i:字节;开始WHILE walk_state<>无开始吧b:=walk_state桥梁;当b<>无开始吧添加到(walk_state^.new_c,b^.from_state|.old_c);b:=b^.下一个;结束;walk_state:=walk_state^.next;结束;结束;(******************蹄程序************)VAR下一状态:p_state;i:整数;input_string:字符串[20];代码:整数;开始clrscr;高视频;writeln(“计算哈密尔顿路径”);北欧视频;书写;writeln(“该程序计算不同哈密尔顿路径的数量”);writeln('用于两个线图的乘积图。');writeln(“它询问其中一个线图的点数,”);writeln('并计算不同hamilton路径的数量,其中');writeln(“另一个线图的点数从1到不等”);writeln(‘某个数字n(由‘的最大大小决定)’);writeln(“程序使用的数字的表示)。”);书写;writeln(“程序首先生成一个规则语法,每个语法”);writeln('完全推导表示一个hamilton路径。然后它');writeln('计算每个长度的派生数。');书写;重复write('给出第一条直线图的点数(2..',tsize,'):');readln(输入字符串);val(输入字符串,大小,代码);直到(代码=0)AND(尺寸>1)AND;clrscr;高视频;writeln(“语法的构造”);北欧视频;sizem1:=大小-1;初始化所有状态;下一状态:=所有状态;当next_state<>NIL开始吧inc(当前状态编号);state:=下一个状态^.repr;init_bridge{bridge};重复{打印桥;}IF桥_fits_to_state{桥,状态}然后开始make_corners{bridge,state->corners};init_pre_state{角,pre_state,not_fixed};重复IF make_new_state{state,bridge,pre_state->new_state}然后开始打印连接;添加连接(下一状态,新状态);gotoxy(40,12);write('剩余内存:',memavail,'字节');gotoxy(40,6);write('Tot.nonterm.:',nr_states);gotoxy(40,7);write('当前非术语:',Cur_state_nr);gotoxy(40,8);write('Tot.rules:',nr_bridges);gotoxy(40,9);写入('规则/非术语:',nr_bridges/nr_states);如果memuvail<100然后开始gotoxy(1,24);write('可用内存不足。','按');重复,直到readkey='';停止(1);结束结束;直到no_next_pre_state{pre_state,not_fixed}结束;直到no_next_bridge{bridge};next_state:=下一个状态^.next;结束;gotoxy(1,24);书写表示语法。’);重复,直到readkey='';clrscr;打印状态(all_states);gotoxy(1,24);书写表示路径数。');重复,直到readkey='';clrscr;高视频;writeln(“哈密尔顿路径计数算法的结果”);书写;writeln(“#点#路径”);北欧视频;窗口(1,4,79,24);carry_error:=假;init_counting(所有状态);i:=0;WHILE(i<100)AND(非携带错误)开始吧包括(i);下一步计数(所有状态);IF(非进位错误)然后开始写(i:3,'');打印计数(所有状态^.new_c);书写;如果(i MOD 20)=0然后开始书写更多信息');重复,直到读键<>#0;gotoxy(1,wherey);氯雷醇;结束;pre_next_step(所有状态);结束;结束;写入('按用于程序结束。');窗口(1,1,79,24);重复,直到读键<>#0;clrscr;gotoxy(20,10);writeln(“该程序由F.J.Faase编写”);结束。