题目描述
给一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",虽然比较长,但是主要是复制粘贴,并且可以加上一个如果当前位置到边界距离不足时直接break的剪枝,所以,我选择了披着dfs皮的模拟
上代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int n; 6 char a[101][101],b[101][101],t[8]={' ','y','i','z','h','o','n','g'};//先把yizhong存起来 7 bool flag; 8 void dfs(int x,int y){//各种判断各种复制粘贴,主要时注意二位数组里的下标以及剪枝 9 if(x-6>=1&&y+6<=n){//右上 10 for(int i=1;i<=7;i++){ 11 if(a[x-i+1][y+i-1]!=t[i]){ 12 flag=1; 13 } 14 } 15 if(flag==0){ 16 for(int i=1;i<=7;i++){ 17 b[x-i+1][y+i-1]=t[i]; 18 } 19 } 20 flag=0; 21 } 22 if(y+6<=n){//右 23 for(int i=1;i<=7;i++){ 24 if(a[x][y+i-1]!=t[i]){ 25 flag=1; 26 } 27 } 28 if(flag==0){ 29 for(int i=1;i<=7;i++){ 30 b[x][y+i-1]=t[i]; 31 } 32 } 33 flag=0; 34 } 35 if(x+6<=n&&y+6<=n){//右下 36 for(int i=1;i<=7;i++){ 37 if(a[x+i-1][y+i-1]!=t[i]){ 38 flag=1; 39 } 40 } 41 if(flag==0){ 42 for(int i=1;i<=7;i++){ 43 b[x+i-1][y+i-1]=t[i]; 44 } 45 } 46 flag=0; 47 } 48 49 if(x+6<=n){//下 50 for(int i=1;i<=7;i++){ 51 if(a[x+i-1][y]!=t[i]){ 52 flag=1; 53 } 54 } 55 if(flag==0){ 56 for(int i=1;i<=7;i++){ 57 b[x+i-1][y]=t[i]; 58 } 59 } 60 flag=0; 61 } 62 if(x+6<=n&&y-6>=1){//左下 63 for(int i=1;i<=7;i++){ 64 if(a[x+i-1][y-i+1]!=t[i]){ 65 flag=1; 66 } 67 } 68 if(flag==0){ 69 for(int i=1;i<=7;i++){ 70 b[x+i-1][y-i+1]=t[i]; 71 } 72 } 73 flag=0; 74 } 75 if(y-6>=1){//左 76 for(int i=1;i<=7;i++){ 77 if(a[x][y-i+1]!=t[i]){ 78 flag=1; 79 } 80 } 81 if(flag==0){ 82 for(int i=1;i<=7;i++){ 83 b[x][y-i+1]=t[i]; 84 } 85 } 86 flag=0; 87 } 88 if(x-6>=1&&y-6>=1){//左上 89 for(int i=1;i<=7;i++){ 90 if(a[x-i+1][y-i+1]!=t[i]){ 91 flag=1; 92 } 93 } 94 if(flag==0){ 95 for(int i=1;i<=7;i++){ 96 b[x+i-1][y-i+1]=t[i]; 97 } 98 } 99 flag=0; 100 } 101 if(x-6>=1){//上 102 for(int i=1;i<=7;i++){ 103 if(a[x-i+1][y]!=t[i]){ 104 flag=1; 105 } 106 } 107 if(flag==0){ 108 for(int i=1;i<=7;i++){ 109 b[x-i+1][y]=t[i]; 110 } 111 } 112 flag=0; 113 } 114 } 115 int main(){ 116 scanf("%d",&n); 117 for(int i=1;i<=n;i++) 118 for(int j=1;j<=n;j++){ 119 b[i][j]='*'; 120 } 121 for(int i=1;i<=n;i++){ 122 scanf("%s",a[i]+1); 123 } 124 for(int i=1;i<=n;i++){ 125 for(int j=1;j<=n;j++){ 126 dfs(i,j);//其实是模拟哦 127 } 128 } 129 for(int i=1;i<=n;i++,puts("")) 130 for(int j=1;j<=n;j++){ 131 printf("%c",b[i][j]); 132 } 133 return 0; 134 }