坦克大战

坦克大战

大家好,又见面了,我是全栈君,今天给大家准备了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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机发展史_计算机发展史感悟

    计算机发展史_计算机发展史感悟转载地址:https://www.jianshu.com/p/6fb655c286bc一、史前时代【1623——1895】1623年:德国科学家契克卡德(W.Schickard)制造了人类有史以来第一台机械计算机,这台机器能够进行六位数的加减乘除运算。1642年:法国科学家帕斯卡(B.Pascal)发明了著名的帕斯卡机械计算机,首次确立了计算机器的概念。…

    2022年10月19日
    1
  • python爬虫—–Python访问http的几种方式「建议收藏」

    python爬虫—–Python访问http的几种方式「建议收藏」爬取页面数据,我们需要访问页面,发送http请求,以下内容就是Python发送请求的几种简单方式:会使用到的库urllibrequests1.urlopen2.requests用到requ

    2022年7月3日
    56
  • Tess4J 简单使用入门[通俗易懂]

    Tess4J 简单使用入门[通俗易懂]Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选。而Tess4J则是Tesseract在JavaPC上的应用。在英文和数字识别中性能还是不错的,但是在中文识别中,无论速度还是识别率还是较弱,建议有条件的话,针对场景进行训练,会获得较好结果,本文仅对目前Tess4J的用法进行介绍。———————本文来自jian_cheng_90的CSDN博客,全文地址请点击:https://blog.csdn.net/risky

    2022年6月11日
    27
  • phpStorm字体大小无法调整, 怎么办?

    phpStorm字体大小无法调整, 怎么办?

    2021年11月7日
    77
  • js代码中实现页面跳转的几种方式[通俗易懂]

    js代码中实现页面跳转的几种方式[通俗易懂]js代码中实现页面跳转的几种方式注:jquery的$.get(),$.post(),$.ajax()都不会使页面发送跳转,因为其本质都是ajax请求。第一种:window.location.href=”login.jsp?backurl=”+window.location.href;页面跳转最常用的是使用window.location.href=””;这个既可以

    2022年8月13日
    22
  • 【转帖】ArcEngine连接表join

    【转帖】ArcEngine连接表join

    2021年8月17日
    90

发表回复

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

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