单词方阵 洛谷 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:

*******
*******
*******
*******
*******
*******
*******

还是一道比较水的搜索的,可以通过向八个方向判断是否存在"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 }

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/circlegg/p/6507666.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值