华为2015应届生招聘机考体验-杭州站 第3题

来源:互联网 发布:linux如何搭建https 编辑:程序博客网 时间:2024/04/28 17:10
/*
*你现在处于一个迷宫Maze(n×m的矩阵)当中,里面到处都是以字母标注的食物,
但你只能吃掉能连成给定单词W的食物。
如下图,指定W为“SOLO”
C P U C Y
E K L Q H
C R S O L
F A I A O
P G R B C

注意区分英文字母大小写,你只能上下左右行走。

输入:第一行包含两个整数n、m(0<n, m<21)分别表示n行m列的矩阵,第二行是长度不超过
100的单词W,从第3行到底n+3行是只包含大小写英文字母的长度为m的字符串。
输出:如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。

注意:每个字母只能用一次。


思路:深度优先搜索


*/


#include<stdio.h>
#include<string.h>

char str[22][22];
int mark[22][22]={0};
char w[101];

int go[][2]={1,0,-1,0,0,1,0,-1}; //四方向行走坐标差
int n,m; //地图n*m
char flag=0; //是否成功标记
int len; //w的长度

void DFS(int x,int y,int k){
int i;
for(i=0;i<4;i++){ //枚举四个相邻位置
int nx=x+go[i][0];
int ny=y+go[i][1];
if(nx<0||nx>n||ny<0||ny>m) //地图外
continue;
if(mark[nx][ny]==1)
continue; //该位置遍历过
if(str[nx][ny]==w[k]){
if(k==len-1){
flag=1; //搜索成功
return;
}
}else
continue; //此状态后的状态都不是
mark[nx][ny]=1; //标记此状态遍历过
DFS(nx,ny,k+1);
if(flag==1) //已经成功,则直接返回
return ;
}
}

int main(){

scanf("%d %d",&n,&m);
int i,j;
scanf("%s",w);
for(i=0;i<n;i++){
scanf("%s",str[i]);
}
len=strlen(w);

for(i=0;i<n;i++){
for(j=0;j<m;j++){
mark[i][j]=1;
DFS(i,j,0);
}
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
0 0
原创粉丝点击