炸弹人(广搜)

  首先用广度优先搜索来枚举出所有小人能够到达的点,并计算出每个点能够消灭的敌人的数量。如果下一个点能够消灭的敌人数量大于前一个,那么更新消灭敌人数量的最大值,并更新坐标点。下面是代码。

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

using namespace std;

struct A{
int x,y;
};

int Next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int book[20][20],n,m,Max,mx,my;
char Map[20][20];

void getnum(int i, int j)
{
int sum=0,x,y;
x = i, y = j;
while(Map[x][y] != ‘#‘){
if(Map[x][y] == ‘G‘)
sum++;
x--;
}
x = i, y = j;
while(Map[x][y] != ‘#‘){
if(Map[x][y] == ‘G‘)
sum++;
x++;
}
x = i, y = j;
while(Map[x][y] != ‘#‘){
if(Map[x][y] == ‘G‘)
sum++;
y--;
}
x = i, y = j;
while(Map[x][y] != ‘#‘){
if(Map[x][y] == ‘G‘)
sum++;
y++;
}
if(sum > Max){
Max = sum;
mx = i;
my = j;
}
}

void bfs(A head)
{
A h,t;
int i,tx,ty;
queue<A> q;
getnum(head.x,head.y);
q.push(head);
book[head.x][head.y] = 1;
while(!q.empty()){
h = q.front();
q.pop();
for(i = 0; i < 4; i++){
tx = h.x + Next[i][0];
ty = h.y + Next[i][1];
if(tx < 0 || tx >= n || ty < 0 || ty >= m)
continue;
if(Map[tx][ty] == ‘.‘ && book[tx][ty] == 0){
t.x = tx;
t.y = ty;
getnum(tx, ty);
q.push(t);
book[tx][ty] = 1;
}
if(tx == n-1 && ty == m-1)
return ;
}
}
}

int main()
{
A h;
int i,j;
while(~scanf("%d%d%d%d",&n,&m,&h.x,&h.y)){
memset(book,0,sizeof(book));
Max = 0;
mx = h.x;
my = h.y;
for(i = 0; i < n; i++)
scanf("%s",Map[i]);
bfs(h);
printf("(%d, %d) %d\n",mx,my,Max);
}
return 0;
}

/*输入样例:
13 13 3 3
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.#.#
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############

输出:(7,11)10

*/

时间: 2024-11-14 21:06:10

炸弹人(广搜)的相关文章

NYOJ 284 坦克大战 &amp;&amp; POJ 2312 Battle City (广搜+优先队列)

链接:click here~~ 题意: 描述 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 space

Catch That Cow(广搜)

个人心得:其实有关搜素或者地图啥的都可以用广搜,但要注意标志物不然会变得很复杂,想这题,忘记了标志,结果内存超时: 将每个动作扔入队列,但要注意如何更简便,更节省时间,空间 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and t

codevs 1225:八数码难题【双向广搜】

这里是传送门 这道题用普通BFS是可以做的,但是很明显没得过,效率太低了.效率更高的算法A*和双向广搜都可取,这写一下双向广搜的. 注意题目中的判重很重要,可以转化成九位数用hash来解决这个问题. #include <set> #include <string> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

迷宫广搜

上学期学了C,这学期学C++.感觉最难的还是算法,上周作业的一道广搜题是我第一次接触广搜,由于第一学期刚学编程就接触的太多的算法难题,不禁对代码产生畏惧,不过还好没有放弃,虽然算法很难,但我慢慢找到了一点学数学时的乐趣.先介绍一下这道未来的我看过来会觉得很简单一道题吧 You are provided a maze(迷宫), and you need to program to find the least steps to walk from the start to the end.And

宽搜和广搜、

广搜与深搜的小区别 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化). 像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的.深搜就

hdu1241详解 Java广搜搞定

import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int m = sc.nextInt();//输入地图的行数 int n = sc.nextInt();//输入地图的列数 if (m == 0) {//若m=0则退出程序 break; } // 初始化图

poj 1166 The Clocks 记录路径的广搜

题意: 给9个时钟的初始状态,和一些对某几个钟的操作,求最少经过几步能到目标状态(全指向12点). 分析: 明显的广搜,但实现起来的细节要注意:1.因为要记录路径,所以要在整个程序执行过程中扩展出的节点在输出路径前不能销毁, 故采用静态内存分配的方法(开node[600000],用get_node()创建节点.2.queue<node>比queue<int>要多花1别的时间. //poj 1166 //sep9 #include <iostream> #include

nyoj 523 双向广搜

题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstdio> #include<queue> using namespace std; /* 用普通搜索TLE,已知起点和终点,可以考虑双向广搜或A*算法加速搜索 双向广搜,一个方向从出发点向终点搜索,一个方向从终点向出发点搜索,搜索到相同的结点时,即找到最短路径. */ const int N

hdu 2717 Catch That Cow(广搜bfs)

题目链接:http://i.cnblogs.com/EditPosts.aspx?opt=1 Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7909    Accepted Submission(s): 2498 Problem Description Farmer John has been inform

HDU 2267 How Many People Can Survive(广搜,简单)

题目 //一道简单的广搜水题 #include<queue> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; struct tt { int x,y; }; char mp[310][310]; int vis[310][310]; //看了题解,发现只有4个方向,而不是8个方向....题目貌似都没说清楚