`
aijuans
  • 浏览: 1565559 次
社区版块
存档分类
最新评论

POJ 2312 Battle City 优先多列+bfs

阅读更多

来源:http://poj.org/problem?id=2312

题意:题目背景就是小时候玩的坦克大战,求从起点到终点最少需要多少步。已知S和R是不能走得,E是空的,可以走,B是砖,只有打掉后才可以通过。

思路:很容易看出来这是一道广搜的题目,但是因为走E和走B所需要的时间不一样,因此不能用普通的队列存点。因为对于走B来说,要先打掉砖才能通过,所以我们可以理解为走B需要两步,而走E是指需要1步的。因此,不能用普通队列来存。我们可以用STL中的优先队列来存,每次从队头取出的都是步数少的点就可以了。这样最先搜到的就是最优解。

代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <string.h>
#include <algorithm>
#include <string>
using namespace std;

#define CLR(arr,val) memset(arr,val,sizeof(arr))
struct point{
	int x,y,step;
	bool operator < (const point & p) const{
	   return step > p.step;
	} 
};
const int N = 305;
char map[N][N];
int sx,sy,ex,ey,flag[N][N],row,col;
int addx[4] = {0,0,1,-1};
int addy[4] = {1,-1,0,0};
int bfs(){
	priority_queue<point> qq;
	point p;
	p.x = sx; p.y = sy; p.step = 0;
	flag[sx][sy] = 1;
	qq.push(p);
	while(!qq.empty()){
		point topp = qq.top();
		qq.pop();
		if(topp.x == ex && topp.y == ey){
			return topp.step;
		}
		else{
			for(int i = 0; i < 4; ++i){
			   int newx = topp.x + addx[i];
			   int newy = topp.y + addy[i];
			   if(newx >= 0 && newx < row && newy >= 0 && newy < col && !flag[newx][newy] ){
				   if(map[newx][newy] == 'S' || map[newx][newy] == 'R')
					   continue;
			      point newp;
				  newp.x = newx;
				  newp.y = newy;
				  flag[newx][newy] = 1;
				  if(map[newx][newy] == 'B'){
					  newp.step = topp.step + 2;
				  }
				  else
					  newp.step = topp.step + 1;
				  qq.push(newp);
			   }
			}
		}
	}
	return -1;
}
int main(){
	//freopen("1.txt","r",stdin);
	while(scanf("%d%d",&row,&col) != EOF){
	   if(row + col == 0)
		   break;
	   CLR(flag,0);
	   CLR(map,'0');
	   for(int i = 0; i < row; ++i){
	      for(int j = 0; j < col; ++j){
			  cin >> map[i][j];
			  if(map[i][j] == 'Y'){
			    sx = i;
				sy = j;
			  }
			  else if(map[i][j] == 'T'){
			    ex = i;
				ey = j;
			  }
		  }
	   }
	  int ans = bfs();
	  printf("%d\n",ans);
	}
	return 0;
}


分享到:
评论

相关推荐

    POJ3026-Borg Maze【BFS+Prim】

    《POJ3026-Borg Maze:BFS与Prim算法的应用解析》 在计算机科学领域,图论是解决问题的重要工具之一,而BFS(广度优先搜索)和Prim算法则是其中的两种经典算法。本篇文章将围绕北大POJ3026题目“Borg Maze”来探讨...

    POJ3009-Curling 2.0【DFS+Vector+回溯+剪枝】

    《POJ3009-Curling 2.0:深度优先搜索、向量、回溯与剪枝的综合应用》 北京大学在线编程平台上的POJ3009题目名为"Curling 2.0",它是一道涉及到算法与数据结构的复杂问题,主要考察了参赛者对深度优先搜索(DFS)、...

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    POJ3733-Changing Digits【DFS+强剪枝】

    【标题】"POJ3733-Changing Digits【DFS+强剪枝】"是一个来自北京大学在线评测系统POJ的编程题目,该题目主要涉及深度优先搜索(DFS)算法和强剪枝策略。在算法竞赛和编程挑战中,这类问题通常要求参赛者通过编写...

    POJ2186-Popular Cows【Tarjan+极大强连通分量+缩点】

    POJ2186-Popular Cows 【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    北大POJ初级-所有题目AC代码+解题报告

    【标题】"北大POJ初级-所有题目AC代码+解题报告" 涉及的知识点主要集中在编程、算法和在线判题系统方面。北京大学(Peking University, 简称PKU)的POJ(Peking University Online Judge)是一个为计算机科学爱好者...

    POJ3373-Changing Digits【DFS+强剪枝】

    标题“POJ3373-Changing Digits【DFS+强剪枝】”涉及的是一个编程竞赛中的问题,这个问题在北大POJ(北京大学在线评测系统)平台上被提出。"Changing Digits"是一个算法挑战,而解决方案是通过深度优先搜索(DFS)...

    LichAmnesia#LichBlogPost#POJ 1205 Water Treatment Plants (DP+高精度

    1.把自己的污水排到河里V 2.把自己的污水送到右边&gt; 3.把自己的污水送到左边

    POJ1753-Flip Game

    本篇文章将对这个问题进行深入解析,并提供两种不同的解决方案:一种基于广度优先搜索(BFS)和位运算,另一种基于深度优先搜索(DFS)和枚举。 一、问题概述 "Flip Game" 是一个二人博弈类问题,玩家轮流操作,...

    北大POJ初级题-数据结构:解题报告+AC代码

    北京大学在线判题系统POJ(Problem Online Judge)是许多编程爱好者和学习者锻炼算法技能的平台,特别是对于初学者,它提供了很多基础题目来帮助理解并应用数据结构。本资源包含的是北大POJ初级题目的解题报告以及...

    POJ1018-Communication System

    北大POJ1018-Communication System 解题报告+AC代码

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    POJ动态规划题目全面总结

    PKU Online Judge上面很全面的动态规划试题总结。动态规划是ACM考点中最重要的一大类算法之一,对于工作人员来说,动态规划也是实际开发中...这是POJ上面很多DP题目的总结与深刻分析。利于算法学习,学长给的,在此分享

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    ACM常用算法及其相应的练习题.docx

    * 深度优先搜索:poj2488, poj3083, poj3009, poj1321, poj2251 * 广度优先搜索:poj3278, poj1426, poj3126, poj3087, poj3414 * 简单搜索技巧和剪枝:poj2531, poj1416, poj2676, poj1129 五、动态规划 * 背包...

    NOI2002.rar_NOI 2002 dragon_poj bfs

    这表明我们即将讨论的是2002年全国青少年信息学奥林匹克竞赛中的一道题目,该题目可能涉及到了使用广度优先搜索(BFS)算法在POJ(编程在线判题系统)上实现并获得正确答案的情况。 首先,让我们来了解一下NOI...

    poj2488——dfs深度优先遍历

    poj 2488——dfs深度优先遍历 //给行数列数,求问能否遍历,给出字典序的一种遍历

Global site tag (gtag.js) - Google Analytics