洛谷P1101 单词方阵

版权声明:转载请注明出处 https://blog.csdn.net/qq_41431457/article/details/88742303

题目描述

给一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 1007≤n≤100)。

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

输出格式:

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

输入输出样例

输入样例#1: 复制

扫描二维码关注公众号,回复: 5709008 查看本文章
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出样例#1: 复制

*******
*******
*******
*******
*******
*******
*******

输入样例#2: 复制

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

输出样例#2: 复制

*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

深搜,注意按照一个方向搜:

#include<bits/stdc++.h> 
#define M 105
using namespace std;
const string st="yizhong";
int dx[8]={0,-1,-1,-1,0,1,1,1};
int dy[8]={1,1,0,-1,-1,-1,0,1};
struct node{int x,y;}k[10];//存放路径 
bool vis[M][M];//标记路径 
char a[M][M];//地图 
int n;

void deep(int x,int y,int m,string t,int dir)
//              x,y,第m步,当前字符串,当前方向 
{
	if(x<0||y<0||y>=n||x>=n) return ;//如果怼墙了 
	if(st[m]!=t[m]) return ;//如果找到的第m个字符不等于给定串的第m个字符 
	k[m]={.x=x,.y=y};//把当前的位置存到路径 
	if(m==6)//如果找到最后一个字符了 
	{
		for(int i=0;i<7;i++)//在地图上标记这条路径 
		vis[k[i].x][k[i].y]=1; 
		return ;
	}

	int ix=x+dx[dir],iy=y+dy[dir];//给定方向走 
	deep(ix,iy,m+1,t+a[ix][iy],dir);	
}
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	cin>>a[i][j];
	
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	if(a[i][j]=='y')
	for(int k=0;k<8;k++)
		deep(i,j,0,"y",k);//搜索 
	
	
	for(int i=0;i<n;i++,cout<<endl)
	for(int j=0;j<n;j++)
	{
		if(vis[i][j]==1) cout<<a[i][j];
		else cout<<'*';
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41431457/article/details/88742303