1. 程式人生 > >單詞方陣(dfs)

單詞方陣(dfs)

函數 () bit IV dfs AC 連續 else hide

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

#######

#######

#######

#######

#######

#######

#######

技術分享圖片
典型的深搜,就是過程有點麻煩,先規定一個字符串yizhong,深度每增加1,對應字符串位置加一。
AC代碼;
#include <bits/stdc++.h>

using namespace std;

int c[110][110]={0};

char bb[30]="yizhong"; int b[110][2]={0}; int n; char a[110][110]; void dfs(int x,int y,int t,int fang)//fang是記錄方向;t記錄深度; { if(t==7)//代表成功,用C字符串記錄; { for(int i=0;i<7;i++) { c[b[i][0]][b[i][1]]=1; } } else { if(fang==1) { if(x-1>=0
&&y-1>=0&&a[x-1][y-1]==bb[t]) { b[t][0]=x-1; b[t][1]=y-1; dfs(x-1,y-1,t+1,fang); } } else if(fang==2) { if(y-1>=0&&a[x][y-1]==bb[t]) { b[t][0]=x; b[t][1]=y-1; dfs(x,y-1,t+1,fang); } } else if(fang==3) { if(y+1<n&&x+1<n&&a[x+1][y+1]==bb[t]) { b[t][0]=x+1; b[t][1]=y+1; dfs(x+1,y+1,t+1,fang); } } else if(fang==4) { if(x+1<n&&a[x+1][y]==bb[t]) { b[t][0]=x+1; b[t][1]=y; dfs(x+1,y,t+1,fang); } } else if(fang==5) { if(y-1>=0&&x+1<n&&a[x+1][y-1]==bb[t]) { b[t][0]=x+1; b[t][1]=y-1; dfs(x+1,y-1,t+1,fang); } } else if(fang==6) { if(y+1<n&&a[x][y+1]==bb[t]) { b[t][0]=x; b[t][1]=y+1; dfs(x,y+1,t+1,fang); } } else if(fang==7) { if(y+1<n&&x-1>=0&&a[x-1][y+1]==bb[t]) { b[t][0]=x-1; b[t][1]=y+1; dfs(x-1,y+1,t+1,fang); } } else if(fang==8) { if(x-1>=0&&a[x-1][y]==bb[t]) { b[t][0]=x-1; b[t][1]=y; dfs(x-1,y,t+1,fang); } } } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",&a[i]); } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(a[i][j]==y) { b[0][0]=i;//這裏要把第一個位置標記一下,因為dfs函數沒記錄第一個; b[0][1]=j; for(int w=1;w<=8;w++) { dfs(i,j,1,w); } } } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(c[i][j]==0) { printf("*"); } else { printf("%c",a[i][j]); } } printf("\n"); } return 0; }
View Code

單詞方陣(dfs)