這道題是好久以前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喔 }