这道题是一个\(DFS\)(深度优先搜索 \(Depth\) \(Frist\) \(Sreach\))的题目,但是…我就是不想敲递归(我绝对不会告诉你我是想偷懒的),因而就有了这个程序和这篇题解……ios
首先,这是一个二维的题目,要寻找8个方向,以下图所示:函数
(-1,-1) | (-1, 0) | (-1, 1) |
---|---|---|
( 0,-1) | 在这向八个方向寻找 | ( 0,1) |
(1,-1) | (1,0) | (1,1) |
因此,要预处理八个方向:spa
int dx[8]={-1,-1,-1,0,0,1,1,1}; int dy[8]={-1,0,1,-1,1,-1,0,1};
还有,这题还须要作一个染色处理,碰到符合状况的就将其染色,因而:code
bool t[101][101];
因而预处理就搞定了。递归
#include<iostream> using namespace std; int n; bool t[101][101]; char w[101][101],d[]="yizhong"; int dx[8]={-1,-1,-1,0,0,1,1,1}; int dy[8]={-1,0,1,-1,1,-1,0,1};
接下来大家必定会觉得我会写\(DFS\)函数,然而,并不是如此。
接下来就愉快的开始\(main( )\)主函数吧!ci
int main() { cin>>n;//输入 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>w[i][j]; for(int x=1;x<=n;x++)//核心重点,[敲显示屏]注意看!!! for(int y=1;y<=n;y++)//循环坐标x,y if(w[x][y]=='y')//若是(x,y)这个位置是y, for(int i=0;i<=7;i++)//就从这开始寻找八个方向是否符合状况 { bool tf=1;//定义标记 int tx,ty;
接下来是重中之重,[敲显示屏]注意:get
for(int j=1;j<=6;j++)//寻找到第几个字符 { tx=x+dx[i]*j;//下一个位置的x坐标,乘j表示往该方向寻找到第j个字符,例如:寻找到"yizhong"中的'z',就是tx=x+dx[i]*2,若是是向左上方寻找,则是寻找相对于当前位置的[(-1*2,-1*2),即(-2,-2)] ty=y+dy[i]*j;//下一个位置的y坐标,同上
继续主程序:io
if(tx<1 || tx>n || ty<1 || ty>n || w[tx][ty]!=d[j])//若是超出边界或不符合 { tf=0;//将标记标为0 break; } } if(tf)//符合状况 for(int j=0;j<=6;j++) t[x+dx[i]*j][y+dy[i]*j]=1;//染色 } for(int i=1;i<=n;i++)//输出 { for(int j=1;j<=n;j++) if(t[i][j]) cout<<w[i][j]; else cout<<"*"; cout<<endl; } return 0; }
完整代码以下:table
#include<iostream> using namespace std; int n; bool t[101][101]; char w[101][101],d[]="yizhong"; int dx[8]={-1,-1,-1,0,0,1,1,1}; int dy[8]={-1,0,1,-1,1,-1,0,1}; int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>w[i][j]; for(int x=1;x<=n;x++) for(int y=1;y<=n;y++) if(w[x][y]=='y') for(int i=0;i<=7;i++) { bool tf=1; int tx,ty; for(int j=1;j<=6;j++) { tx=x+dx[i]*j; ty=y+dy[i]*j; if(tx<1 || tx>n || ty<1 || ty>n || w[tx][ty]!=d[j]) { tf=0; break; } } if(tf) for(int j=0;j<=6;j++) t[x+dx[i]*j][y+dy[i]*j]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) if(t[i][j]) cout<<w[i][j]; else cout<<"*"; cout<<endl; } return 0; }
贴几个得部分分的代码:
40分:class
#include<iostream> using namespace std; int n; bool t[101][101]; char w[101][101],d[]="yizhong"; int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; bool dfs(int x,int y,int p,int s) { if(w[x][y]==d[s]) { t[x][y]=1; if(s==6) return 1; else return dfs(x+dir[p][0],y+dir[p][1],p,s+1); } return 0; } int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>w[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(w[i][j]=='y') for(int k=0;k<=7;k++) { int tx=i+dir[k][0]; int ty=j+dir[k][1]; if(tx>0&&tx<=n&&ty>0&&ty<=n) if(dfs(tx,ty,k,1)) t[i][j]=1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(t[i][j]) cout<<w[i][j]; else cout<<"*"; } cout<<endl; } return 0; }
80分:
```cpp
using namespace std;
int n;
bool t[101][101];
char w[101][101],d[]="yizhong";
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
bool dfs(int x,int y,int p,int s)
{
if(w[x][y]==d[s])
{
if(s==6) { t[x][y]=1; return 1; } else if(!t[x][y]) { t[x][y]=1; if(!dfs(x+dir[p][0],y+dir[p][1],p,s+1)) { t[x][y]=0; return 0; } else return 1; } } return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>w[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(w[i][j]=='y')
for(int k=0;k<=7;k++)
{
int tx=i+dir[k][0];
int ty=j+dir[k][1];
if(tx>0&&tx<=n&&ty>0&&ty<=n)
{
if(dfs(tx,ty,k,1))
t[i][j]=1;
}
} } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(t[i][j]) cout<<w[i][j]; else cout<<"*"; } cout<<endl; } return 0;
}``` 题解到此为止,谢谢[鞠躬]!