洛谷 P1101 单词方阵

题目描述

给一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:

*******
*******
*******
*******
*******
*******
*******

正解貌似是dfs,不过枚举依然可以过。
1.将每个坐标八个方向延伸所构成的8个单词判断是否为yizhong,如果是,则构成这个单词的7个坐标点全部标记。
2.如果被标记,则输出字符,否则输出“*”。
3.AC
时间复杂度:O(8*n^2)

var
    a:array [-10..110,-10..110] of boolean;
    b:array [-10..110,-10..110] of char;
    i,j,k,n:longint;
    s:string;

function check(x,y,z:longint):string;
var
   i:longint;
begin
     check:='';
     for i:=0 to 6 do
         case z of
             1:check:=check+b[x-i,y-i];
             2:check:=check+b[x-i,  y];
             3:check:=check+b[x-i,y+i];
             4:check:=check+b[x  ,y-i];
             5:check:=check+b[x  ,y+i];
             6:check:=check+b[x+i,y-i];
             7:check:=check+b[x+i,  y];
             8:check:=check+b[x+i,y+i];
         end;

end;


procedure flag(p,q,g:longint);
var
  i:longint;
begin
     for i:=0 to 6 do
         case g of
              1:a[p-i,q-i]:=true;
              2:a[p-i,  q]:=true;
              3:a[p-i,q+i]:=true;
              4:a[p  ,q-i]:=true;
              5:a[p  ,q+i]:=true;
              6:a[p+i,q-i]:=true;
              7:a[p+i,  q]:=true;
              8:a[p+i,q+i]:=true;
         end;
end;

begin
    readln(n);
    for i:=1 to n do
        begin
            for j:=1 to n do read(b[i,j]);
            readln;
        end;
    fillchar(a,sizeof(a),false);
    for i:=1 to n do
        for j:=1 to n do
            for k:=1 to 8 do
                begin
                     s:=check(i,j,k);
                     if s='yizhong' then flag(i,j,k);
                end;
    for i:=1 to n do
        begin
            for j:=1 to n do
                if a[i,j] then write(b[i,j])
                          else write('*');
            writeln;
        end;
end.

你可能感兴趣的:(暴力/枚举/模拟,pascal)