7-9 机器人路径
分数 20
全屏浏览
切换布局
作者 肖奕
单位 中国地质大学(北京)
##机器人规划路径
机器人可以在一个m行n列的矩阵中走动。矩阵中的每个格子都用字母进行了标记。机器人行走的路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该机器人不能再进入该格子。
例如矩阵
中包含一条字符" bcced"的路径,但是矩阵中不包含"abcb"路径,因为机器人经过这个字符b(在矩阵中的第一行第二个)格子之后,不能再次进入该格子。现对k条路径进行判断,在—个矩阵中是否存在一条包含该字符串所有字符的路径,如果有输出“yes”,否则输出“no”
输入格式:
第一行输入两个正整数m,n(表示矩阵行列数m,n<150)。
接下来m行,每行输入n个字符(以空格分隔)
第m+2行输入一个正整数k(含义如题目所述)
接下来k行,每行输入一条字符路径
输出格式:
针对k条路径,输出k行的判断结果(yes或no)
输入样例1:
3 4
a b c e
s f c s
a d e e
3
bcced
abcb
abccee
输出样例1:
yes
no
yes
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
```
#include<bits/stdc++.h>
using namespace std;
const int N=155;
char g[N][N];
bool st[N][N];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int n,m,k;
string s;
bool flag;
void dfs(int x,int y,int t){
if(t==s.size()){
flag=true;
return;
}
for(int i=0;i<4;i++){
int x1=x+dx[i];
int y1=y+dy[i];
if(x1<1||x1>n||y1<1||y1>m)continue;
if(g[x1][y1]!=s[t])continue;
if(st[x1][y1])continue;
st[x1][y1]=true;
dfs(x1,y1,t+1);
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
cin>>k;
while(k--){
memset(st,0,sizeof st);
cin>>s;
flag=false;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]==s[0]&&!flag)
dfs(i,j,1);
if(flag)cout<<"yes\n";
else cout<<"no\n";
}
return 0;
}
```