坦克大战

坦克大战

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

坦克大战

时间限制:
1000 ms  |  内存限制:
65535 KB
难度:
3

描写叙述

Many of us had played the game “Battle city” in our childhood, and some people (like me) even often play it on computer now. 

What we are discussing is a simple edition of this game. Given a map that consists of empty spaces, rivers, steel walls and brick walls only. Your task is to get a bonus as soon as possible suppose that no enemies will disturb you (See the following picture). 



坦克大战


Your tank can’t move through rivers or walls, but it can destroy brick walls by shooting. A brick wall will be turned into empty spaces when you hit it, however, if your shot hit a steel wall, there will be no damage to the wall. In each of your turns, you can choose to move to a neighboring (4 directions, not 8) empty space, or shoot in one of the four directions without a move. The shot will go ahead in that direction, until it go out of the map or hit a wall. If the shot hits a brick wall, the wall will disappear (i.e., in this turn). Well, given the description of a map, the positions of your tank and the target, how many turns will you take at least to arrive there?

输入
The input consists of several test cases. The first line of each test case contains two integers M and N (2 <= M, N <= 300). Each of the following M lines contains N uppercase letters, each of which is one of ‘Y’ (you), ‘T’ (target), ‘S’ (steel wall), ‘B’ (brick wall), ‘R’ (river) and ‘E’ (empty space). Both ‘Y’ and ‘T’ appear only once. A test case of M = N = 0 indicates the end of input, and should not be processed.
输出
For each test case, please output the turns you take at least in a separate line. If you can’t arrive at the target, output “-1” instead.
例子输入
3 4
YBEB
EERE
SSTE
0 0
例子输出
8
题解:採用优先队列+广度优先遍历,求从地图上的Y走到T的最小步数,当中S和R不能走。B要走两步,E要走一步 
     优先队列基础知识:http://blog.csdn.net/zchlww/article/details/39803511
                     http://blog.csdn.net/zchlww/article/details/39803463
#include <cstdio>
#include <cstring>
#include <queue>
using std::priority_queue;
int m, n;
char map[302][302];//表示地图 
bool vis[302][302];//表示訪问标志位 
struct Node{
  int x, y, steps;
  friend bool operator<(Node a, Node b)
  {//改变优先级,因为优先队列默认是大的数字优先级高                                                    
    return a.steps > b.steps;//如今改为step小的优先级高。符合题意  
  }
} you, tar;
int mov[][2] = {0, 1, 0, -1, 1, 0, -1, 0};
priority_queue<Node> PQ;//定义优先队列的变量 
int check(Node a){
  if(a.x < 0 || a.y < 0 || a.x >= m || a.y >= n)
    return 0;
  if(vis[a.x][a.y]) return 0;
  if(map[a.x][a.y] == 'B') return 2;
  if(map[a.x][a.y] == 'E') return 1;
  if(map[a.x][a.y] == 'T') return 1;
  return 0;
}

int BFS(){//广度优先遍历 
  Node temp, sta;
  int count;
  vis[you.x][you.y] = 1;
  PQ.push(you);
  while(!PQ.empty())
  {
    sta = temp = PQ.top(); PQ.pop();
    for(int i = 0; i < 4; ++i)
    {
      temp.x += mov[i][0];
      temp.y += mov[i][1];
      if(count = check(temp))
      {
        temp.steps += count;
        if(map[temp.x][temp.y] == 'T') 
          return temp.steps;
        vis[temp.x][temp.y] = 1;
        PQ.push(temp);
      }
      temp = sta;
    }
  }
  return -1;
}
 
int main(){
  while(scanf("%d%d", &m, &n), m || n){
    for(int i = 0; i < m; ++i)
    {
      scanf("%s", map[i]);
      for(int j = 0; j < n; ++j)
        if(map[i][j] == 'Y') you.x = i , you.y = j;
        else if(map[i][j] == 'T') tar.x = i , tar.y = j; 
    }
    memset(vis, 0, sizeof(vis));
    while(!PQ.empty()) PQ.pop();
    printf("%d\n", BFS());
  }
  return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117420.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 软测试总结

    软测试总结

    2022年1月12日
  • 西门子SCL定时器_西门子plc断开延时定时器

    西门子SCL定时器_西门子plc断开延时定时器在西门子PLC中利用STEP7软件编程的时候,想实现延时接通功能,通常会用到S_ODT定时器,因为这个最简单。在SCL中同样可以也将这个简单的延时接通定时器使用上,只不过没有像在LAD梯形图中编程那么简单了,稍微繁复了一些,当然这只是我个人意见。还是来看一下我的做法吧,如下图:该图片是SCL建立的源文件,编译后将会生成一个FC1的程序块。图中可以看到我定义了4个输入变量,2个输出变量,以及一个临时变量。可以看到最后编译的结果是0错误0警告!…

    2022年9月26日
  • oracle 查询指定约束的关联表

    oracle 查询指定约束的关联表

    2021年8月26日
  • vscode插件配置_vscode bootstrap插件

    vscode插件配置_vscode bootstrap插件vscode插件列表及配置信息

    2022年4月21日
  • pycharm执行代码快捷键_python 函数调用

    pycharm执行代码快捷键_python 函数调用按住Ctrl,点击函数名称,即可跳转到该函数的代码文件中选中后,函数显示有下划线:点击函数名称,跳转到该函数所在的文件里:

    2022年8月29日
  • 数据中台,什么是数据中台?

    数据中台,什么是数据中台?导读:数据中台被誉为大数据的下一站,由阿里兴起,核心思想是数据共享,并在2018年因为“腾讯数据中台论”再度成为了人们谈论的焦点。在3月15日ThoughtWorks技术雷达峰会上,关于数据中台的话题也获得了众多参会者的热烈关注。如今似乎人人都在提数据中台,但却不是所有人都清楚数据中台到底意味着什么。数据中台是只有大厂才需要考虑的高大上的概念吗?普通企业该不该做数据中台?数据中…

    2022年7月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号