洛谷1101:單詞方陣(DFS)
阿新 • • 發佈:2019-01-31
題目描述
給一的字母方陣,內可能蘊含多個“yizhong”單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間可以交叉,因此有可能共用字母。輸出時,將不是單詞的字母用*代替,以突出顯示單詞。例如:
輸入: 8 輸出: qyizhong *yizhong gydthkjy gy****** nwidghji n*i***** orbzsfgz o**z**** hhgrhwth h***h*** zzzzzozo z****o** iwdfrgng i*****n* yyyygggg y******g
輸入輸出格式
輸入格式:
第一行輸入一個數。(7≤n≤100)。
第二行開始輸入的字母矩陣。
輸出格式:
突出顯示單詞的矩陣。
輸入輸出樣例
輸入樣例#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;
}