题目来源
www.luogu.org
原网址
http://www.luogu.org/problem/show?pid=1101#
题目描述
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间不交叉,因此不共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:输入:8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
输入输出格式
输入格式: 第一行输入一个数n。(7<=n<=100)。
第二行开始输入nXn的字母矩阵。
突出显示单词的nXn矩阵。
输入输出样例
输入样例#1:7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
*******
题解
这道题只要先找到‘y',不用讨论正序还是倒序,只要往八个个方向搜就行了。这里有一个优化的好窍门,当找到‘i'时,就可以记录这个方向搜索了,也不用怕超时了。在最后记录打印时,可以从'g'的地方向记录的那个方向倒着循环,并标记。
代码
var
n,i,j,k:longint;
ss:string;
s:array[1..100] of string;
p:array[1..100,1..100] of 0..1;
procedure nn(t:longint;s1:string;fx,dq,x,y:longint);
var
i,j,k:longint;
begin
if t>7 then exit;
if s1<>ss[t] then exit;
if fx=0 then fx:=dq;
if t=7 then
begin
j:=x;k:=y;
if fx=1 then for i:=1 to 7 do
begin
p[j,k]:=1;
j:=j-1;
end;
if fx=2 then for i:=1 to 7 do
begin
p[j,k]:=1;
j:=j-1;k:=k-1;
end;
if fx=3 then for i:=1 to 7 do
begin
p[j,k]:=1;
j:=j-1;k:=k+1;
end;
if fx=4 then for i:=1 to 7 do
begin
p[j,k]:=1;
j:=j+1;
end;
if fx=5 then for i:=1 to 7 do
begin
p[j,k]:=1;
j:=j+1;k:=k-1;
end;
if fx=6 then for i:=1 to 7 do
begin
p[j,k]:=1;
j:=j+1;k:=k+1;
end;
if fx=7 then for i:=1 to 7 do
begin
p[j,k]:=1;
k:=k+1;
end;
if fx=8 then for i:=1 to 7 do
begin
p[j,k]:=1;
k:=k-1;
end;
exit;
end;
if fx=0 then
begin
nn(t+1,s[x+1][y],0,1,x+1,y);
nn(t+1,s[x+1][y+1],0,2,x+1,y+1);
nn(t+1,s[x+1][y-1],0,3,x+1,y-1);
nn(t+1,s[x-1][y],0,4,x-1,y);
nn(t+1,s[x-1][y+1],0,5,x-1,y+1);
nn(t+1,s[x-1][y-1],0,6,x-1,y-1);
nn(t+1,s[x][y-1],0,7,x,y-1);
nn(t+1,s[x][y+1],0,8,x,y+1);
end
else
begin
if fx=1 then nn(t+1,s[x+1][y],0,1,x+1,y);
if fx=2 then nn(t+1,s[x+1][y+1],0,2,x+1,y+1);
if fx=3 then nn(t+1,s[x+1][y-1],0,3,x+1,y-1);
if fx=4 then nn(t+1,s[x-1][y],0,4,x-1,y);
if fx=5 then nn(t+1,s[x-1][y+1],0,5,x-1,y+1);
if fx=6 then nn(t+1,s[x-1][y-1],0,6,x-1,y-1);
if fx=7 then nn(t+1,s[x][y-1],0,7,x,y-1);
if fx=8 then nn(t+1,s[x][y+1],0,8,x,y+1);
end;
end;
begin
readln(n);
ss:='yizhong';
for i:=1 to n do readln(s[i]);
for i:=1 to n do
for j:=1 to n do
if s[i,j]=ss[1] then
nn(1,s[i,j],0,0,i,j);
for i:=1 to n do
begin
for j:=1 to n do if p[i,j]=1 then write(s[i,j]) else write('*');
writeln;
end;
end.