洛谷——P1101 单词方阵(dfs)c++

文章目录

  • 一、题目
  • 单词方阵
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
  • 二、题解


一、题目

单词方阵

题目描述

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

输入格式

第一行输入一个数 n n n ( 7 ≤ n ≤ 100 ) (7 \le n \le 100) (7n100)

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

输出格式

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

样例 #1

样例输入 #1

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

样例输出 #1

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

样例 #2

样例输入 #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

二、题解

  • 基本思路:
    题目中说了“同一单词摆放时不再改变方向”,所以只需要找到每一个初始字母’y’的位置,然后再确定方向,问题是该字母确定方向呢?找到y后我们只需要对该位置的8个方向遍历一遍找到第二个字母‘i’,此时即找到了摆放字母的方向,具体请看代码。
  • 代码
#include
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 
int n,cnt=0;
char g[101][101];
int dx[]={0,1,0,-1,1,1,-1,-1};
int dy[]={1,0,-1,0,-1,1,-1,1};
string str="yizhong";
vector<PII> s;//记录路径 
bool b[101][101];//记录输出'*'还是输出字母 
//参数分别时位置(x,y),方向(cx,cy),找到字母的个数num
void dfs(int x, int y, int cx, int cy, int num){
	s.push_back({x,y});
	if(num==7){
		//cout<<"***"<<' '<
		while(!s.empty()){
			auto t=s.back();
			b[t.fi][t.se]=true;
			s.pop_back();
		} 
		return;
	}
	//cout<
	//沿着cx,cy方向继续搜索
	int tx=x+cx;
	int ty=y+cy;
	if(tx<=0||tx>n||ty<=0||ty>n) return;//是否越界 
	if(g[tx][ty]!=str[num]) return;//判断下一个字母是不是要找的
	dfs(tx, ty, cx, cy, num+1);
}
//输入
void input(){
	repn(i, 1, n)
	  repn(j, 1, n)
	  	cin>>g[i][j];
}
//输出
void output(){
	repn(i, 1, n){
	  repn(j, 1, n)
	    if(b[i][j])
	      cout<<g[i][j];
	    else
	      cout<<'*';
	cout<<endl;
	}
}

void solve(){
	cin>>n;
	//输入 
	input(); 
	//找到首字母y,并确定方向
	//需要保存走过的路径,这里我用了vector s; 
	repn(i, 1, n)
	  repn(j, 1, n)
	    if(g[i][j]=='y')
	    	rep(k, 0, 8)
	    	  if(g[i+dx[k]][j+dy[k]]=='i'){
	    	  	s.clear();
	    	    dfs(i, j, dx[k], dy[k], 1);
	    	}
	//输出 
	output();
}

signed main(){
	IOS;
	int T=1;
	while(T--){
		solve();
	}
	return 0;
}

你可能感兴趣的:(搜索,深度优先,c++,算法)