洛谷——P1101 单词方阵(dfs)c++
一、题目
单词方阵
题目描述
给一
n
×
n
n \times n
n×n 的字母方阵,内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着
8
8
8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 * 代替,以突出显示单词。
输入格式
第一行输入一个数 n n n。 ( 7 ≤ n ≤ 100 ) (7 \le n \le 100) (7≤n≤100)。
第二行开始输入 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<bits/stdc++.h>
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<<"***"<<' '<<s.size()<<endl;
while(!s.empty()){
auto t=s.back();
b[t.fi][t.se]=true;
s.pop_back();
}
return;
}
//cout<<x<<' '<<y<<' '<<cx<<' '<<cy<<"****"<<num<<endl;
//沿着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<PII> 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;
}
更多推荐

所有评论(0)