1. 程式人生 > >洛谷1101:單詞方陣(DFS)

洛谷1101:單詞方陣(DFS)

題目描述
給一n×nn \times n的字母方陣,內可能蘊含多個“yizhong”單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著88個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間可以交叉,因此有可能共用字母。輸出時,將不是單詞的字母用*代替,以突出顯示單詞。例如:

輸入:         
    8                     輸出:
    qyizhong              *yizhong
    gydthkjy              gy******
    nwidghji              n*i*****
    orbzsfgz              o**z****
    hhgrhwth              h***h***
    zzzzzozo              z****o**
    iwdfrgng              i*****n*
    yyyygggg              y******g

輸入輸出格式

輸入格式:
第一行輸入一個數nn。(7≤n≤100)。

第二行開始輸入n×nn \times n的字母矩陣。

輸出格式:
突出顯示單詞的n×nn \times n矩陣。

輸入輸出樣例

輸入樣例#1:

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

輸出樣例#1:

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

輸入樣例#2:

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

輸出樣例#2:

*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

思路

設定方向陣列,找到字母"y"的位置,然後利用方向陣列來找和"y"相鄰的"i",然後在這個方向上進行dfs,如果在該方向上可以組成單詞"yizhong",把這些位置記錄一下,所有的點遍歷結束後,輸出就可以了

AC程式碼

#include <bits/stdc++.h>
#define ms(a) memset(a,0,sizeof(a))
using namespace std;
char ch[110][110];
int
vis[110][110]; int n; int dis[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; char cha[]="yizhong"; struct Node { int x,y; }p[1000]; void dfs(int x,int y,int res,int k) { if(res==7) for(int i=0;i<7;i++) vis[p[i].x][p[i].y]=1; int dx=x+dis[k][0]; int dy=y+dis[k][1]; if(ch[dx][dy]==cha[res+1]||res==6) { p[res].x=x; p[res].y=y; dfs(dx,dy,res+1,k); } } int main() { ms(vis); cin>>n; for(int i=0;i<n;i++) cin>>ch[i]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(ch[i][j]=='y') { for(int k=0;k<8;k++) { int x=i+dis[k][0]; int y=j+dis[k][1]; if(ch[x][y]=='i') dfs(i,j,0,k); } } } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(vis[i][j]) cout<<ch[i][j]; else cout<<"*"; } cout<<endl; } return 0; }