普及练习场-深度优先搜索-P1101 单词方阵

题目描述
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:

输入:
8 输出:
qyizhong yizhong
gydthkjy gy
*****
nwidghji ni*****
orbzsfgz oz
***
hhgrhwth hh***
zzzzzozo z
o**
iwdfrgng i*****n

yyyygggg y
****g
输入输出格式
输入格式:

第一行输入一个数n。(7<=n<=100)。

第二行开始输入nXn的字母矩阵。

输出格式:

突出显示单词的nXn矩阵。

输入输出样例
输入样例#1:

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出样例#1:








————————————————
思路: 深搜

#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;
const int maxn= 100+10;
int n;
char mp[maxn][maxn];
bool vis[maxn][maxn];
int xx[]={1,1,1,0,0,-1,-1,-1};
int yy[]={1,0,-1,1,-1,1,0,1};
string yz="yizhong";
void dfs(int x,int y){
	for(int i=0;i<8;i++){
		int flag1=1;
		for(int j=0;j<7;j++){
			int dx=x+j*xx[i];
			int dy=y+j*yy[i];
			if(dx<0||dx>n||dy<0||dy>n||yz[j]!=mp[dx][dy]){
				flag1=0;
				break;
			}
		}
		if(flag1)
		{
			for(int j=0;j<7;j++){
			int dx=x+j*xx[i];
			int dy=y+j*yy[i];
			vis[dx][dy]=1;
			}
		}
	}
} 
int main(){
	cin>>n;
for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>mp[i][j];
			}
		}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mp[i][j]=='y'){
				dfs(i,j);
			}
		}
	} 
for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(!vis[i][j])
			cout<<"*";
			else
			cout<<mp[i][j];
			}
		
		cout<<endl;
	}
	return 0;
}

发布了108 篇原创文章 · 获赞 2 · 访问量 2077

猜你喜欢

转载自blog.csdn.net/zqhf123/article/details/104388353