坦克大战

坦克大战

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

相关推荐

  • 基于Krack的网络攻击「建议收藏」

    基于Krack的网络攻击「建议收藏」更新软件包apt-getupdate安装相应的环境apt-getinstalllibnl-3-devlibnl-genl-3-devpkg-configlibssl-devnet-toolsgitsysfsutilspython-scapypython-pycryptodome下载Krack运行脚本gitclonehttps://github.com/…

    2022年6月10日
  • linux grep命令

    linux grep命令

    2021年8月24日
  • redis在linux安装_安装win7系统卡在安装程序

    redis在linux安装_安装win7系统卡在安装程序1、首先上官网下载Redis压缩包,地址:http://redis.io/download选择一个稳定版下载。使用工具上传压缩文件到linux系统2、通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作cdRedistar-zkvfredis.tar.gz3、执行make命令对Redis解压后文件进行编译cdredismake4、编译完成之…

    2022年10月5日
  • Python文件名后缀_python判断文件后缀

    Python文件名后缀_python判断文件后缀转自:python获取文件后缀名的方法_qingfengxd1的博客-CSDN博客_python获取文件后缀获取文件的后缀名有好几种方法:第一种:splittext()方法os.path.splittext(path)[-1]第二种:endswith()方法path=”test_user_info.py”bool=path.endswith(“.py”)print(bool)第三种:判断后缀名是否在字符串中(这种会存在误判,若是.pyx后缀,一样会打印True,前面两种不会)path=”te

    2022年9月23日
  • c++中数组下标越界输出什么_C语言数组的越界和溢出

    c++中数组下标越界输出什么_C语言数组的越界和溢出引言最近突然想到当数组array有2个元素,而访问其array[2]时会不会编译错误的问题,答案是编译的时候不报错,只有运行的时候才报错。感悟以下是我测试用的代码,程序可以正常编译,且编译正确,只是在运行的时候出现程序崩溃。chararray[2]={‘2′,’3’};std::cout<<array[2]<<std::endl;//编译正常,运行的时候出现问题基于上述现象,说明程序在编译的时候没有进行下标越界的检查,当一个程序生成可执行文件的时候

    2022年10月2日
  • 网站404页面怎么做

    网站404页面怎么做网站404页面怎么做?谈及网站404页面,诸多站长在网站运营的过程中,难以避免404页面的出现。404页面意味着网站存在死链接,当搜索引擎蜘蛛爬取此类网址的时候,应当反馈404状态吗,告知此URL网址已经失效,搜索引擎蜘蛛便会回馈到数据中心,从中清除数据。而在页面的前端,应该对访客予以信息提示,告知内容的已经不存在,优化相关搜索内容,尽可能避免降低访客体验度,由此可见,网站404页面的制作应当以两种出发点进行,即对于搜索引擎蜘蛛状态吗的正确回馈和对前端界面及内容设计出发。404网页正确设置网

    2022年7月27日

发表回复

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

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