查找湖南问题

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

 

View Code
 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.

至于题目解法,必然搜索吧 。就看怎么写更简洁,不爱出错了。

 

转载于:https://www.cnblogs.com/skysun/archive/2012/03/23/2413828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值