洛谷P1101 单词方阵(dfs) 题解

题目来源:

点击打开链接

题目描述:

题目描述

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

输入:
    8                     输出:
    qyizhong              *yizhong
    gydthkjy              gy******
    nwidghji              n*i*****
    orbzsfgz              o**z****
    hhgrhwth              h***h***
    zzzzzozo              z****o**
    iwdfrgng              i*****n*
    yyyygggg              y******g

输入输出格式

输入格式:

第一行输入一个数 nn 。( 7 \le n \le 1007n100 )。

第二行开始输入 n \times nn×n 的字母矩阵。

输出格式:

突出显示单词的 n \times nn×n 矩阵。

输入输出样例

输入样例#1:  复制
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:  复制
*******
*******
*******
*******
*******
*******
*******









解题思路:

   本题我写的有点烦,就是把每个字符是‘y’的点都加入队列,然后进行bfs,如果刚好可以组成yizhong就把这些点全都标记,最后把标记的输出,没标记的就输出“*”。就是在bfs的时候分了好几个方向进行搜索,代码巨长。。。。

代码:

#include <iostream>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
char zf[7]={'y','i','z','h','o','n','g'};
int dir[8][2]={{1,0},{0,-1},{1,1},{1,-1},{-1,0},{0,1},{-1,1},{-1,-1}};
struct newt{
	int x,y,t;
}dian;
int n;
int jl[105][105];
char tu[105][105];
bool pd(newt a,char b)
{
	if(a.x>=1&&a.x<=n&&a.y>=1&&a.y<=n&&zf[a.t]==b)return 1;
	else return 0;
}
void bfs(int a,int b)
{
	if(a<7&&n-a<6&&b<7&&n-b<6)return ;
	stack<newt>q;
	dian.x=a;dian.y=b;dian.t=0;
	q.push(dian);
	if(a>=7){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x-1;
			nod.y=now.y;
			nod.t=now.t+1;
			if(pd(nod,tu[nod.x][nod.y]))
			{
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
	q.push(dian);
	if(n-a>=6){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x+1;
			nod.y=now.y;
			nod.t=now.t+1;
			if(pd(nod,tu[nod.x][nod.y]))
			{
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
	q.push(dian);
	if(b>=7){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x;
			nod.y=now.y-1;
			nod.t=now.t+1;
			if(pd(nod,tu[nod.x][nod.y]))
			{
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
	q.push(dian);
	if(n-b>=6){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x;
			nod.y=now.y+1;
			nod.t=now.t+1;
//			cout<<nod.x<<" "<<nod.y<<endl;
			
			if(pd(nod,tu[nod.x][nod.y]))
			{
				//cout<<tu[nod.x][nod.y]<<" "<<q.size()<<endl;
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
	q.push(dian);
	if(a>=7&&b>=7){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x-1;
			nod.y=now.y-1;
			nod.t=now.t+1;
			if(pd(nod,tu[nod.x][nod.y]))
			{
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
	q.push(dian);
	if(a>=7&&n-b>=6){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x-1;
			nod.y=now.y+1;
			nod.t=now.t+1;
			if(pd(nod,tu[nod.x][nod.y]))
			{
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
	q.push(dian);
	if(n-a>=6&&b>=7){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x+1;
			nod.y=now.y-1;
			nod.t=now.t+1;
			if(pd(nod,tu[nod.x][nod.y]))
			{
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
	q.push(dian);
	if(n-a>=6&&n-b>=6){
		int flag=0;
		while(!q.empty())
		{
			newt now=q.top();
			if(now.t==6){
				flag=1;break;
			}
			newt nod;
			nod.x=now.x+1;
			nod.y=now.y+1;
			nod.t=now.t+1;
			if(pd(nod,tu[nod.x][nod.y]))
			{
				q.push(nod);
			}
			else break;
		}
		if(flag){
			while(!q.empty())
			{
				jl[q.top().x][q.top().y]=1;
				q.pop();
			}
		}
		else {
			while(!q.empty())q.pop();
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%s",tu[i]+1);
	}
	memset(jl,0,sizeof(jl));
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		if(tu[i][j]=='y'&&!jl[i][j])
		{
			bfs(i,j);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		if(jl[i][j])cout<<tu[i][j];
		else cout<<"*";
		cout<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40400202/article/details/80959052