nyoj 坦克大战 (优先队列)

BFS题目。输入完图之后可以先预处理一下,然后用优先队列解决。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<map>
 9 #include<iomanip>
10 #include<climits>
11 #include<string.h>
12 #include<cmath>
13 #include<stdlib.h>
14 #include<vector>
15 #include<set>
16 #define INF 1e7
17 #define MAXN 100010
18 #define maxn 111
19 #define maxm 1000
20 #define Mod 1000007
21 #define MIN(a,b) (a < b ? a : b)
22 #define MAX(a,b) (a > b ? a : b)
23 #define mem(a) memset(a,0,sizeof(a))
24 using namespace std;
25 typedef long long LL;
26 int n, m;
27 int sx, sy, fx, fy;
28 char G[333][333];
29 int mp[333][333];
30 int vis[333][333];
31 int dx[] = { 1, -1, 0, 0 }, dy[] = { 0, 0, 1, -1 };
32
33 struct node {
34     int x, y, step;
35     bool operator <(const node a) const {
36         return step > a.step;
37     }
38 };
39
40 bool check(int x, int y)
41 {
42     if (vis[x][y] || x < 0 || y < 0 || x >= n || y >= m)
43         return true;
44     return false;
45 }
46
47 int bfs()
48 {
49     priority_queue<node> q;
50     q.push({ sx, sy, 0 });
51     vis[sx][sy] = 1;
52     while (!q.empty()) {
53         node now = q.top();
54         q.pop();
55         if (now.x == fx && now.y == fy)
56             return now.step;
57         node next;
58         for (int i = 0; i < 4; ++i) {
59             next.x = now.x + dx[i];
60             next.y = now.y + dy[i];
61             next.step = now.step;
62             if (check(next.x, next.y)) continue;
63             if (mp[next.x][next.y] != -1) {
64                 q.push({ next.x, next.y, next.step + mp[next.x][next.y] });
65                 vis[next.x][next.y] = 1;
66             }
67         }
68     }
69     return -1;
70 }
71
72 int main()
73 {
74     while (~scanf("%d%d",&n,&m), n + m) {
75         memset(vis,0,sizeof(vis));
76         memset(mp,0,sizeof(mp));
77         for (int i = 0; i < n; ++i) {
78             scanf("%s", G[i]);
79             for (int j = 0; j < m; ++j) {
80                 if (G[i][j] == ‘Y‘)
81                     sx = i, sy = j;
82                 else if (G[i][j] == ‘T‘)
83                     fx = i, fy = j;
84             }
85         }
86         for (int i = 0; i < n; ++i)
87             for (int j = 0; j < m; ++j) {
88                 if (G[i][j] == ‘S‘ || G[i][j] == ‘R‘) mp[i][j] = -1;
89                 else if (G[i][j] == ‘B‘) mp[i][j] = 2;
90                 else if (G[i][j] == ‘E‘ || G[i][j] == ‘T‘) mp[i][j] = 1;
91             }
92         cout << bfs() << endl;
93     }
94     return 0;
95 }
时间: 2024-10-10 06:02:34

nyoj 坦克大战 (优先队列)的相关文章

NYOJ 284 坦克大战 【BFS】+【优先队列】

坦克大战 时间限制: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 co

nyoj 284 坦克大战【bfs】

坦克大战 时间限制: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 co

nyoj284 坦克大战(dijkstra(dfs+优先队列))

题目284 题目信息 运行结果 本题排行 讨论区 坦克大战 时间限制: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

DS课设【坦克大战最短路】(MummyDing)

DS课设[坦克大战最短路] 还是决定写点东西简单记录下这次编码. 一.想法 还没放假的时候只想着用C#实现,算法图论方面觉得图论方向会靠谱些,但一直没有什么好点子.C#以前也没学过,自信来源于MFC的学习经历(以前也是用它做了C语言课设).C#应该是没有MFC那么复杂的,心想看几天应该就可以上手一些小东西了,事实证明也如此. 寒假时间相对以前更长,也并不着急做课设.开始一段是刷题+学习Kinect+顺带了解Kinect,后来在刷题过程中遇到这题,还蛮有意思的,当即就写了个"坦克大战最短路简单设计

坦克大战系列(3.0版)

无论头上是怎样的天空,我准备承受任何风暴.--拜伦 本讲内容:坦克3.0版(面向对象的思想) 要求:画出我方坦克会动并且会发射子弹.画出敌人坦克 一.同一个包下建二个文件分别为:MyTankGame.Members(负责其它成员譬如:制造坦克.子弹等) MyTankGame类 /** * 功能:坦克游戏的3.0版本 * 1:画出坦克 * 2:实现我方坦克移动并且會發子彈,并 画出敌人的坦克 */ package a; import javax.swing.*; import java.awt.*

C++代码训练之坦克大战(2)

这一篇中,我们继续继续进行我们的坦克大战. 位置信息数据结构 在游戏设计过程中,需要记录大量的位置信息,如果仅仅使用(x,y)坐标很容易出错.这一篇中,我们先定义两个简单的数据结构用来保存点和矩形的信息. 在项目中新建Model目录,创建下面四个文件: 代码如下: Point.h #ifndef __POINT_H__ #define __POINT_H__ class Point { public: Point(int x = 0, int y = 0) : m_x(x), m_y(y){};

坦克大战(版本2.5-版本2.9)

版本2.5 功能:添加“血块”步骤:        1)添加blood类        2)添加必要的方法:eat方法等        3)让blood对象固定轨迹运动, 并在一定时间后消失 具体代码实现: 新增的blood类: 1 import java.awt.Color; 2 import java.awt.Graphics; 3 import java.awt.Rectangle; 4 5 //模拟血块,坦克吃了可以补血 6 public class Blood { 7 int x, y

脚本游戏之四: 坦克大战源码注释(待续。。。)

要点: 1.echo的高级用法,主要包括:颜色.位置定位输出等 2.trap 信号捕捉, kill 发送信号 3.捕捉用户输入,控制后台进程 参考:坦克大战 文章结尾的几段代码 总体: 多个进程后台并行运行, 前端一个段接受用户输入的代码,根据用户输入通过发送信号控制后台进程. 几乎每一个组件都是一个后台运行的函数. #!/bin/bash # BY: LingYi # DATE: 2016.02.23 #place temporary files tmpdir='/tmp' #u:up d:d

Java__线程---基础知识全面实战---坦克大战系列为例

今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自己的java进行一下实战. 每个程序版本代码中,都附有相关注释,看完注释大家就可以对本程序设计有个很明显的思路.真的很有趣,想对java重新温习的同学完全不必再对厚厚的java基础书籍进行阅读了,在跟着本次代码练习并分析后,大家一定会对java各方面基础知识 尤其是线程的知识有更深一步的了解!!! 本次坦克大