P1101 單詞方陣

這道題是好久以前A過的題,一道深搜嘛,不過我沒有用深搜解(高舉模擬大旗!!!!),也不是很難因此我就直接貼AC代碼啦。ios

思路是這樣的:循環遍歷這個方陣,若是遇到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喔 
}

以上僅是我的對於這道題的所有思路與想法,若是有什麼不對的地方,還請各位大佬及時向我糾正。

相關文章
相關標籤/搜索