P1101 单词方阵

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喔 
}

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

上一篇:Java 位运算符


下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 肆 - 正负 指令 | 5. 移位