题目描述
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式
输入格式:
第一行输入一个数n。(7<=n<=100)。
第二行开始输入nXn的字母矩阵。
输出格式:
突出显示单词的nXn矩阵。
输入输出样例
输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
∗∗∗∗∗∗∗
∗∗∗∗∗∗∗
∗∗∗∗∗∗∗
∗∗∗∗∗∗∗
∗∗∗∗∗∗∗
∗∗∗∗∗∗∗
∗∗∗∗∗∗∗
分析:
从每个y开始搜,然后记忆化一下。
代码:
const
hehe:array[1..7]of char=('y','i','z','h','o','n','g');
dh:array[1..8]of longint=(-1,-1,-1,0,0,1,1,1);
dl:array[1..8]of longint=(-1,0,1,-1,1,-1,0,1);
var
a:array[0..101,0..101]of char;
b:array[0..101,0..101]of boolean;
n,i,j:longint;
s:ansistring;
p:boolean;
function try(k,l,r,t:longint):boolean;
var
x,i,j:longint;
p:boolean;
begin
p:=false;
if k>7 then exit(true);
if a[l,r]<>hehe[k] then exit(false);
if k=1 then
begin
for x:=1 to 8 do
begin
i:=l+dh[x];
j:=r+dl[x];
if try(k+1,i,j,x) then begin b[l,r]:=true;p:=true; end;
end;
end
else
begin
i:=l+dh[t];
j:=r+dl[t];
if try(k+1,i,j,t) then begin b[l,r]:=true;p:=true; end;
end;
if p then exit(true) else exit(false);
end;
begin
readln(n);
for i:=1 to n do
begin
readln(s);
for j:=1 to n do
a[i,j]:=s[j];
end;
for i:=1 to n do
for j:=1 to n do
begin
if (b[i,j]) then continue;
if (not(try(1,i,j,0))) then b[i,j]:=false
else b[i,j]:=true;
end;
for i:=1 to n do
for j:=1 to n do
if not(b[i,j]) then a[i,j]:='*';
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]);
writeln;
end;
end.