坦克大战

坦克大战

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


相关推荐

  • Java基础语法(十一)类?对象?我能不能写个妹子类给自己造个(一个够吗?)对象?

    Java基础语法(十一)类?对象?我能不能写个妹子类给自己造个(一个够吗?)对象?

    2021年5月17日
    161
  • arm指令移位指令

    arm指令移位指令arm指令移位指令LSL逻辑左移ASL算术左移LSR逻辑右移ASR算术右移ROR循环右移RRX带扩展的循环右移ASL和LSL是等同的,可以自由互换。你可以用一个立即值(从0到31)指定移位数量,或用包含在0和31之间的一个值的寄存器指定移位数量。 逻辑或算术左移(LSL)MOVR1,#1

    2022年5月5日
    102
  • HQL的左连接_左连接与右连接的区别

    HQL的左连接_左连接与右连接的区别最近做一个查询实现把一个表的记录全部显示出来并且显示关联的另外一个表的记录,这当然谁都知道要用到外连接查询,然而过程并不愉快。在Hibernate的映射文件中配置好关联关系之后,查询的时候可以直接使用比如selectnewmap(student.studentIDasstudentID,student.studentAccountasstudentAccount,student.stu

    2025年11月26日
    6
  • xampp的安装教程

    xampp的安装教程1、准备xampp安装包并新建一个空文件夹如:xampp2、启动xampp,开始安装,安装过程如下图所示:点击yes,后如下图点击next,进行下一步,将软件安装到刚刚新建的空文件夹xampp中,接下,疯狂点击next,在该界面稍等一会,正在安装安装完成后,打开安装的xampp文件夹,内容如下:3、运行xampp.exe,界面如下XAMPP安装完毕后如图,Apache和Mysql勾选,发现运行正常即可。(注意:首次启动前要将Apache和MySQL前面的ModulesS

    2022年7月15日
    27
  • Android service ( 一 ) 三种开启服务方法

    Android service ( 一 ) 三种开启服务方法一、Service简介Service是android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activ

    2022年7月4日
    22
  • cloin 激活码【2021.8最新】

    (cloin 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月27日
    95

发表回复

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

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