您的位置:首页 > 理论基础 > 计算机网络

Word Maze 网络小游戏

2014-04-27 20:17 465 查看
Word Maze 网络小游戏

Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉。如上图,假设给定单词if,

你必须先吃掉i然后才能吃掉f。但现在你的任务可没有这么简单,你现在处于一个迷宫Maze(n×m的矩阵)当中,里面到处都是以字母标注的食物,

但你只能吃掉能连成给定单词W的食物。

如下图,指定W为“SOLO”,则在地图中红色标注了单词“SOLO”。 



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

输入:

输入第一行包含两个整数n、m(0<n, m<21)分别表示n行m列的矩阵,第二行是长度不超过100的单词W,从第3行到底n+3行是

只包含大小写英文字母的长度为m的字符串。

输出:

如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。注意:每个字母只能用一次。

样例输入:

5 5

SOLO

CPUCY

EKLQH

CRSOL

EKLQO

PGRBC
样例输出: YES

这是一道华为机试题,博主不才,有问题还请大家指出,一起探讨。

下面是代码:

#include "stdafx.h"
#include<iostream>
#include<string>

using namespace std;

static char **pCube;
static char word[100];
static int row,column;

//吃字母逻辑
void eatWord(int w,int i,int j,int *flag){
//不能越界
if(i<0||i>row||j<0||j>column) {
return;}
//成功条件是标志位w==单词长度
if (w==strlen(word)){
cout<<"YES";
return;
}
if (i<row-1&&pCube[i+1][j]==word[w]&&flag[(i+1)*row+j]==0){
flag[(i+1)*row+j]=1;
eatWord(w+1,i+1,j,flag);
}
if (i>0&&pCube[i-1][j]==word[w]&&flag[(i-1)*row+j]==0){
flag[(i-1)*row+j]=1;
eatWord(w+1,i-1,j,flag);
}
if (j<column-1&&pCube[i][j+1]==word[w]&&flag[i*row+j+1]==0){
flag[i*row+j+1]=1;
eatWord(w+1,i,j+1,flag);
}
if (j>0&&pCube[i][j-1]==word[w]&&flag[i*row+j-1]==0){
flag[i*row+j-1]=1;
eatWord(w+1,i,j-1,flag);
}
//将字母使用标志位重新全部置零
for (int x = 0; x < row*column; x++)
{
flag[x]=0;
}
return;
}

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"输入行数 列数:"<<endl;
cin>>row>>column;
cout<<"输入单词:"<<endl;
cin>>word;
cout<<"输入矩阵:"<<endl;
pCube = new char*[row];

//初始化标志位,保证每个字母只用一次
int *flag = (int *)malloc(sizeof(int)*row*column);
for (int i = 0; i < row*column; i++)
{
flag[i]=0;
}

//初始化矩阵
for (int i = 0; i < row; i++)
{
pCube[i] = new char[column];
cin>>pCube[i];
}

//找到矩阵中和单词首字母一致的位置,开吃!
int w=0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
if(word[w]==pCube[i][j]){
flag[i*row+j]=1;
eatWord(w+1,i,j,flag);
}
}
}
cout<<"NO"<<endl;
system("PAUSE");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 练习题 华为