[洛谷1101]单词方阵

题目来源

www.luogu.org
原网址
http://www.luogu.org/problem/show?pid=1101#


题目描述

给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着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:

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值