[华为机试真题]66.单词搜索

原创 2015年07月06日 21:54:28

题目

这里写图片描述

代码

/*---------------------------------------
*   日期:2015-07-06
*   作者:SJF0115
*   题目:WordSearch
*   来源:华为机试真题
-----------------------------------------*/
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;


bool DFS(vector<vector<char> > &board,string word,int index,int x,int y,vector<vector<bool> > &visited){
    // 找到目标
    if(index == word.size()){
        return true;
    }//if
    int m = board.size();
    if(m == 0){
        return false;
    }//if
    int n = board[0].size();
    // 出界
    if(x < 0 || x >= m || y < 0 || y > n){
        return false;
    }//if
    // 已访问过
    if(visited[x][y]){
        return false;
    }//if
    // 不相等 剪枝
    if(board[x][y] != word[index]){
        return false;
    }//if
    visited[x][y] = true;
    // left
    bool left = DFS(board,word,index+1,x,y-1,visited);
    // right
    bool right = DFS(board,word,index+1,x,y+1,visited);
    // up
    bool up = DFS(board,word,index+1,x-1,y,visited);
    // bottom
    bool bottom = DFS(board,word,index+1,x+1,y,visited);
    visited[x][y] = false;
    // 四个方向 任意方向找到一个即可
    return left || right || up || bottom;
}
// 单词搜索
bool WordSearch(vector<vector<char> > &board,int m,int n,string word){
    if(n <= 0 || m <= 0 || board.empty()){
        return false;
    }//if
    // 判断是否已经访问过
    vector<vector<bool> > visited(m,vector<bool>(n,false));
    // 搜索
    for(int i = 0;i < m;++i){
        for(int j = 0;j < n;++j){
            if(board[i][j] == word[0]){
                // 以board[i][j]为起点开始搜索
                if(DFS(board,word,0,i,j,visited)){
                    return true;
                }//if
            }//if
        }//for
    }//for
    return false;
}

int main(){
    int m,n;
    string word;
    //freopen("C:\\Users\\Administrator\\Desktop\\acm.txt","r",stdin);
    while(cin>>m>>n>>word){
        vector<vector<char> > board(m,vector<char>(n,0));
        // 输入
        for(int i = 0;i < m;++i){
            for(int j = 0;j < n;++j){
                cin>>board[i][j];
            }//for
        }//for
        // 搜索
        bool result = WordSearch(board,m,n,word);
        if(result){
            cout<<"YES"<<endl;
        }//if
        else{
            cout<<"NO"<<endl;
        }//else
    }//while
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

带通配符*的字符串匹配

2. 如果不想用递归,可以考虑另外一种思路是对于t,可以看成被一些*串(连续的*组成的子串)划分成了一组跟s一样纯由字母组成的子串。这样问题就转化成了在s中寻找一个子串序列。开始时还像普通的串匹配一样...

[华为机试练习题]35.找零钱

题目描述: 我们知道人民币有1、2、5、10、20、50、100这几种面值。现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。比如4元,能用4张1元、2张...

2014华为机试真题(2)

1.数字是否存在相同部分         求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。...

2014华为机试真题(1)

1.及格线问题 10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下: (1) 及格线是10的倍数; (2) 保证至少有60%的学生及格; (3) 如果所有的学生都高于60分,则及格线为6...

[华为机试真题][2014]64.实现两个合法时间相加

题目描述: 给定两个合法的时间(格式固定:hh:mm:ss,时间合法,不用考虑其它情况),输入两个时间相加后的结果;注意,相加后的结果也必需是一个合法的时间; 附合法时间定义:小时在[00-23...

[华为机试真题]72.操作系统任务调度问题

题目操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中, 系统任务的优先级 < 50,用户任务的优先级 >= 50且 ...

[华为机试真题]70.分苹果

题目M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。1

[华为机试真题]68.简单四则运算

题目输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 3.1、表达式只含 +, -, *, / 四则运算符,不含括号 3.2、表达式数值只包含个位整数(0-9),且不会出现0作...

[华为机试真题]73.公交站寻址

题目一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’ , ‘B’ , ‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。 现给定路径长度Y,找到能够到达的公交站的个数,路...

[华为机试真题]69.姓名的夫妻相

题目在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是“夫妻相”。所谓“夫妻相”,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。 本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[华为机试真题]66.单词搜索
举报原因:
原因补充:

(最多只允许输入30个字)