Poj(2312),坦克大战,BFS的变形

题目链接:http://poj.org/problem?id=2312

挺有趣的一道题目,然而很容易WA,我就WA了一次,虽然我Debug的时候已经知道哪里出问题了,就是比如说我搜到B和E时,从B搜第三个点,B左边的E就被搜了,step为3,然而其实他是step为2,

这里的处理方法很是巧妙,可以从B出发时,把B换成E,step+1,形成一个新的结点加入到队列中去

#include <stdio.h>
#include <string.h>
#include <queue>

using namespace std;

int to[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};

struct Point
{
    int r,c;
    int step;
};
int r,c;
char maps[305][305];
bool vis[305][305];

bool judge (int rx,int cx)
{
    if(rx<0||rx>=r||cx<0||cx>=c||maps[rx][cx]==‘S‘||maps[rx][cx]==‘R‘||vis[rx][cx])
        return true;
    else return false;
}

int main()
{
    int sr,sc;
    while(scanf("%d%d",&r,&c),r)
    {
        memset(vis,false,sizeof(vis));

        for(int i=0; i<r; i++)
        {
            scanf("%s",maps[i]);
            for(int j=0; j<c; j++)
            {
                if(maps[i][j]==‘Y‘)
                {
                    sr = i;
                    sc = j;
                }
            }
        }
        int ans = -1;

        queue<Point> Q;
        Point a,next;
        a.r = sr;
        a.c = sc;
        a.step = 0;
        vis[a.r][a.c] = true;
        Q.push(a);
        while(!Q.empty())
        {
            a = Q.front();
            Q.pop();

            if(maps[a.r][a.c]==‘T‘)
            {
                ans = a.step;
                break;
            }
            if(maps[a.r][a.c]==‘B‘)
            {
                a.step ++;
                maps[a.r][a.c] = ‘E‘;
                Q.push(a);
                continue;
            }

            for(int i=0; i<4; i++)
            {
                next.r = a.r + to[i][0];
                next.c = a.c + to[i][1];
                if(judge(next.r,next.c))
                    continue;
                vis[next.r][next.c] = true;
                next.step = a.step +1;
                Q.push(next);

            }

        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-10 22:38:53

Poj(2312),坦克大战,BFS的变形的相关文章

NYOJ 284 坦克大战 bfs + 优先队列

这类带权的边的图,直接广搜不行,要加上优先队列,这样得到的结果才是最优的,这样每次先找权值最小的,代码如下 1 #include <stdio.h> 2 #include <iostream> 3 #include <queue> 4 #include <string.h> 5 using namespace std; 6 typedef struct Node{ 7 int x, y; 8 int step; 9 friend bool operator

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

nyoj-----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 game. Given a map that co

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

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

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

坦克大战系列(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