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

简介:

题目

一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’ , ‘B’ , ‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。
现给定路径长度Y,找到能够到达的公交站的个数,路径中不能包含路障。
路径长度定义:
节点与其自身的距离为0
节点与其上、下、左、右四个相邻节点距离都为1

要求实现函数

int FindStat (const char *Map, unsigned int iArrN, unsigned int iPathLen)

输入

Map:           城市布局
iArrN:         城市布局矩阵的行数
iPathLen: 给定的路径长度

输出

返回

能够到达的公交站个数

注:输入矩阵是以一维形式保存的二维数组,

代码

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

/*
S...S
.....
....B
S...S
....X

*/
// map             城市布局
// len             给定的路径长度
// index           路径的第几步
// visited         是否已经访问
// count           能够到达的公交站个数           
void DFS(vector<vector<char> > &map,int len,int index,int x,int y,vector<vector<bool> > &visited,int &count){
    int row = map.size();
    int col = map[0].size();
    // 超出规定路径长度
    if(index == len+1){
        return;
    }//if
    // 越界
    if(x < 0 || y < 0 || x >= row || y >= col){
        return;
    }//if
    // 路障
    if(map[x][y] == 'B'){
        return;
    }//if
    // 找到一个未曾到达的汽车站
    if(map[x][y] == 'S' && !visited[x][y]){
        visited[x][y] = true;
        cout<<"可以到达("<<x<<","<<y<<")汽车站"<<endl;
        ++count;
    }//if

    // left
    DFS(map,len,index+1,x,y-1,visited,count);
    // right
    DFS(map,len,index+1,x,y+1,visited,count);
    // up
    DFS(map,len,index+1,x-1,y,visited,count);
    // bottom
    DFS(map,len,index+1,x+1,y,visited,count);
    //visited[x][y] = false;
}
// Map          城市布局
// row          城市布局矩阵的行数
// len          给定的路径长度
int FindStat (const char *Map, unsigned int row, unsigned int len){
    int size = strlen(Map);
    int col = size / row;
    // 转换为矩阵
    vector<vector<char> > map(row,vector<char>(col,'.'));
    for(int i = 0;i < size;++i){
        map[i / col][i % col] = Map[i];
    }//for
    int count = 0;
    vector<vector<bool> > visited(row,vector<bool>(col,false));
    // 搜索
    for(int j = 0;j < row;++j){
        for(int k = 0;k < col;++k){
            if(map[j][k] == 'X'){
                DFS(map,len,0,j,k,visited,count);
                break;
            }//if
        }//for
    }//for
    return count;
}

int main(){
    char map[1000];
    int row;
    int len;
    //freopen("C:\\Users\\Administrator\\Desktop\\acm.txt","r",stdin);
    while(cin>>map>>row>>len){
        cout<<FindStat(map,row,len)<<endl;
    }//while
    return 0;
}
目录
相关文章
|
4月前
|
存储 算法 C语言
C语言练习记录(蓝桥杯练习)(小蓝数点)
C语言练习记录(蓝桥杯练习)(小蓝数点)
|
9月前
|
网络性能优化
第4章 数据链路层练习题答案(第三版)
第4章 数据链路层练习题答案(第三版)
84 0
|
5月前
|
人工智能 算法 机器人
迷宫问题(C语言实现)(牛客网百度笔试真题)
迷宫问题(C语言实现)(牛客网百度笔试真题)
47 0
|
8月前
|
存储 人工智能 算法
2022 数据结构与算法《王道》学习笔记 (十)串 KMP算法 串的总结 课后习题笔记
2022 数据结构与算法《王道》学习笔记 (十)串 KMP算法 串的总结 课后习题笔记
|
8月前
|
存储 机器学习/深度学习 测试技术
【浙江大学PAT真题练习乙级】1008 数组元素循环右移问题 (20分)真题解析
【浙江大学PAT真题练习乙级】1008 数组元素循环右移问题 (20分)真题解析
|
9月前
第3章 物理层练习题答案(第三版)
第3章 物理层练习题答案(第三版)
28 0
|
12月前
牛客刷题记录(常见笔试题)(上)
牛客刷题记录(常见笔试题)(上)
|
12月前
|
监控 算法
牛客刷题记录(常见笔试题)(下)
牛客刷题记录(常见笔试题)(下)
|
存储 算法
蓝桥杯 真题:明码 一题掌握3种码
蓝桥杯 真题:明码 一题掌握3种码
89 0
蓝桥杯 真题:明码 一题掌握3种码
|
算法 C++
蓝桥杯练习系统 基础练习 全部习题 题目及AC代码(包括VIP试题)C++(上)
蓝桥杯练习系统 基础练习 全部习题 题目及AC代码(包括VIP试题)C++(上)
137 0