查找湖南问题
skysun原创,转载请注明出处
一、 查找湖南问题(hunan.pas)。
有一个含有N×N(N<=20)的大写字母方阵,试编程找出其中隐含的所有“HUNAN”字样,五个字母只能以上下左右方向连续。
输入:方阵由文本文件读入,文本文件第一行存放N的值,第二行开始依次存放各行的字母。
输出:写入文件中,每一行一个方案,每行内容为方案中依次经过字符的行号和列号,若无法找到,则输出“NO ANSWER!”。
输入输出举例:
输入:input.TXT: 则输出output.TXT
6 NO.1 (1,2) (2,2) (3,2) (4,2) (4,1)
AHUBBJ NO.2 (1,2) (2,2) (3,2) (3,3) (3,4)
UUKDAE NO.3 (6,3) (6,4) (6,5) (6,6) (5,6)
BNANNH
NAANWA
SPOUCN
RTHUNA
{由于排版问题,格式不大美观,来源不详……自己在湖南的相关测试里找吧。。}
细节问题大部分在程序里有注释
输出优先级为使y坐标尽可能小,然后使x坐标尽可能小
skysun原创转载请注明出处 http://www.cnblogs.com/skysun
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 program sky;
2 var
3 px : array[1..4] of longint=(0,-1,1,0);
4 py : array[1..4] of longint=(-1,0,0,1);
5 f : array[0..5,1..2] of longint;
6 c : array[0..21,0..21] of char;
7 i,j,n : longint;
8 tot : longint;
9 s : string[5];
10 v : array[0..20,0..20] of boolean;
11 {p 数组定义时方向顺序很重要}
12 procedure dfs(x,y,k :longint );
13 var
14 i,j: longint;{淫荡的一个地方,j要是里面不开的话就死循环了......}
15 begin
16 for i:=1 to 4 do
17 if c[x+px[i],y+py[i]]=s[k+1] then
18 if not v[x+px[i],y+py[i]] then {v数组还是要的,不然因为‘HUNAN’第三位和第五位一样。会尴尬的。。}
19 if k=4 then
20 begin
21 inc(tot);
22 write('NO.',tot,' (');
23 for j:=1 to 4 do write(f[j,1],',',f[j,2],') (');
24 writeln(x+px[i],',',y+py[i],')');
25 end else
26 begin
27 f[k+1,1]:=x+px[i]; f[k+1,2]:=y+py[i];{之前打错了啊。。。。。}
28 v[x+px[i],y+py[i]]:=true;
29 dfs(x+px[i],y+py[i],k+1);
30 v[x+px[i],y+py[i]]:=false;
31 end;
32
33 end;
34 begin
35 assign(input,'hunan.in'); reset(input);
36 assign(output,'hunan.out'); rewrite(output);
37 readln(n); s:='HUNAN';
38 for i:=1 to n do
39 begin
40 for j:=1 to n do read(c[i,j]);
41 readln;
42 end;
43 for i:=1 to n do
44 for j:=1 to n do
45 if c[j,i]='H' then
46 begin
47 f[1,1]:=j; f[1,2]:=i;
48 dfs(j,i,1);
49 end;
50 if tot=0 then writeln('NO ANSWER!');
51 close(input); close(output);
52 end.
至于题目解法,必然搜索吧 。就看怎么写更简洁,不爱出错了。