单词方阵(dfs)
Posted 勿忘安己
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单词方阵(dfs)相关的知识,希望对你有一定的参考价值。
给一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(" "); } return 0; }
以上是关于单词方阵(dfs)的主要内容,如果未能解决你的问题,请参考以下文章