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:
******* ******* ******* ******* ******* ******* *******
练习搜索
#include <cstring> #include <math.h> #include <vector> #include <queue> #include <cstdio> #include <iostream> #include <cstring> using namespace std; int n; char key[8]={0,'y','i','z','h','o','n','g'}; char map[120][120]; bool ok[120][120]; int line[10][3]; void dfs(int x,int y,int t,int last)//t已完成匹配的字母数 { if(t==7) { for(int i=1;i<=7;i++) ok[line[i][1]][line[i][2]]=1; ok[x][y]=1; return ; } line[t][1]=x,line[t][2]=y; char c=key[t+1]; if(map[x+1][y]==c&&(last==0||last==1)) dfs(x+1,y,t+1,1); if(map[x-1][y]==c&&(last==0||last==2)) dfs(x-1,y,t+1,2); if(map[x][y+1]==c&&(last==0||last==3)) dfs(x,y+1,t+1,3); if(map[x][y-1]==c&&(last==0||last==4)) dfs(x,y-1,t+1,4); if(map[x-1][y-1]==c&&(last==0||last==5)) dfs(x-1,y-1,t+1,5); if(map[x-1][y+1]==c&&(last==0||last==6)) dfs(x-1,y+1,t+1,6); if(map[x+1][y+1]==c&&(last==0||last==7)) dfs(x+1,y+1,t+1,7); if(map[x+1][y-1]==c&&(last==0||last==8)) dfs(x+1,y-1,t+1,8); return; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>map[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(map[i][j]=='y') dfs(i,j,1,0); } for(int i=1;i<=n;i++,cout<<endl) for(int j=1;j<=n;j++) if(ok[i][j]) printf("%c",map[i][j]); else printf("*"); return 0; }