• P1101 单词方阵


    这道题是很久之前A过的题,一道深搜嘛,不过我没有用深搜解(高举模拟大旗!!!!),也不是很难所以我就直接贴AC代码啦。

    思路是这样的:循环遍历这个方阵,如果遇到y就接着一个方向往下找,然后如果找到了就用一个数组标记,最后输出就好了

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    long long n,xi=0,xj=0;//xi和xj的作用是储存每次变动后的x和y 
    char s[1100][1100],ss[1100][1100];//一个是用来输入以及遍历的,一个是用来标记以及输出的 
    char a[7]={'i','z','h','o','n','g'};//这个数组是用来储存出现y之后应该判断的字符的 
    int dx[8]={-1,1,0,0,-1,1,-1,1};//dx和dy分别表示方向 
    int dy[8]={0,0,-1,1,-1,1,1,-1};
    int ans=0;
    int main(){
        cin>>n;//输入n 
        for(int i=0;i<n;i++){//循环n*n次 
            for(int j=0;j<n;j++){
                cin>>s[i][j];//输入方阵 
                ss[i][j]=s[i][j];//这个数组到后面要用来标记的 
            }
        }
        for(int i=0;i<n;i++){//循环n*n次,开始遍历 
            for(int j=0;j<n;j++){
                if(s[i][j]=='y'){//判断当前字符是否等于y 
                    xi=i;//先储存一下当前的x和y 
                    xj=j;//也就是i和j啦,一会要用它去加dx和dy,确定新方向 
                    for(int k=0;k<8;k++){//因为是一共可以有八个方向(上,下,左,右,左上,左下,右上,右下),所以循环8次 
                        int q=1;//新建一个变量,是用来当作小旗子的 
                        for(int k2=0;k2<6;k2++){//因为“yizhong”一共是7个字符,但我们已经判断了y了,所以只需要循环6次 
                            int x=xi+dx[k];//每次都加一样的,他的7个字符一定得是同一方向的 
                            int y=xj+dy[k];//举例:本来往右上方发展的,结果突然就拐了个弯,往左上发展了,这样是不正确的
                            if(x>=0&&y>=0&&x<n&&y<n&&s[x][y]==a[k2]){//判断当前x和y是否越界以及当前字符是否正确 
                                xi=x;//如果全部符合条件,那么就储存下来 
                                xj=y;
                            }
                            else{//否则 
                                q=0;//小旗就等于零,表示他本次的探索是错误的 
                                xi=i;//xi和xj也要返回初始的位置 
                                xj=j;//也就是i和j 
                                break;//结束当前循环 
                            }
                        }
                        if(q==1){//如果小旗等于1,表示本次探索正确 
                            ss[xi][xj]='*';//标记数组把“yizhong”这个字符串所在的位置都标记上*号 
                            ss[xi-dx[k]][xj-dy[k]]='*';
                            ss[xi-(dx[k]*2)][xj-(dy[k]*2)]='*';
                            ss[xi-(dx[k]*3)][xj-(dy[k]*3)]='*';
                            ss[xi-(dx[k]*4)][xj-(dy[k]*4)]='*';
                            ss[xi-(dx[k]*5)][xj-(dy[k]*5)]='*';
                            ss[xi-(dx[k]*6)][xj-(dy[k]*6)]='*';
                        }
                    }
                }
            }
        }
        for(int i=0;i<n;i++){//最后输出 
            for(int j=0;j<n;j++){
                if(ss[i][j]=='*') cout<<s[i][j];//如果标记数组这里是*号,也就是说这里是字符串“yizhong”的所在位置,那么就输出字母(s[i][j]) 
                else cout<<"*";//否则,也就是说这里不是字符串“yizhong”的所在位置,直接输出*号就好了 
            }
            cout<<endl;//每输出一行就回一次车 
        }
        return 0;//不要忘了return 0喔 
    }

    以上仅是个人对于这道题的全部思路与想法,如果有什么不对的地方,还请各位大佬及时向我纠正。

  • 相关阅读:
    实体类实现序列化
    异常处理
    Springboot的模块化使用
    Springboot的开始
    RxJava用法
    okhttp的Post方式
    OKhttp使用
    soundPool声音池
    ScheduledExecutor定时器
    timer定时器
  • 原文地址:https://www.cnblogs.com/dgdger/p/12887066.html
Copyright © 2020-2023  润新知