P1101 单词方阵
题目大意:
找出沿一方向连续出现的“yizhong”,其他字符变成“*”
思路:
如果发现了这个单词的开头“y”,然后就dfs搜索,直到找到了yizhong整个单词。
代码:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; long long n; char map[101][101];//表示N*N的字母矩阵 char ci[]="yizhong"; long long dx[8]={1,1,0,1,0,-1,-1,-1}; long long dy[8]={1,-1,1,0,-1,-1,1,0};//8个方位 long long bj[101][101];//标记数组 void dfs(long long idx,long long idy,long long jg,long long fx){ if(jg==7){ for(int i=1;i<=7;i++){ bj[idx][idy]=1;//记录方位 idx-=dx[fx];//更新 idy-=dy[fx];//更新 } return; } else{ if(fx==-1){ for(int i=0;i<8;i++){//枚举8个方位 if(dx[i]+idx>=1&&dy[i]+idy>=1&&dx[i]+idx<=n&&dy[i]+idy<=n&&ci[jg]==map[dx[i]+idx][dy[i]+idy]){//判断是否越界,当前位置是否符合字母 dfs(dx[i]+idx,dy[i]+idy,jg+1,i);//更新位置,继续搜索 } } } else{ if(dx[fx]+idx>=1&&dy[fx]+idy>=1&&dx[fx]+idx<=n&&dy[fx]+idy<=n&&ci[jg]==map[dx[fx]+idx][dy[fx]+idy]){//判断是否越界,当前位置是否符合字母 dfs(dx[fx]+idx,dy[fx]+idy,jg+1,fx);//更新位置,继续搜索 } } } } int main(){ scanf("%lld",&n);//输入 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>map[i][j];//输入字母矩阵 } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(map[i][j]=='y'){//如果找到了'y' dfs(i,j,1,-1);//dfs搜索 } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(bj[i][j]==1){ cout<<map[i][j];//输出 } else{ printf("*"); } } printf("\n"); } return 0; }