War chess is hh's favorite game:
In this game, there is an N * M battle map, and every player has his own Moving Val (MV). In each round, every player can move in four directions as long as he has enough MV. To simplify the problem, you are given your position and asked to output which grids you can arrive.

In the map:
'Y' is your current position (there is one and only one Y in the given map).
'.' is a normal grid. It costs you 1 MV to enter in this gird.
'T' is a tree. It costs you 2 MV to enter in this gird.
'R' is a river. It costs you 3 MV to enter in this gird.
'#' is an obstacle. You can never enter in this gird.
'E's are your enemies. You cannot move across your enemy, because once you enter the grids which are adjacent with 'E', you will lose all your MV. Here “adjacent” means two grids share a common edge.
'P's are your partners. You can move across your partner, but you cannot stay in the same grid with him final, because there can only be one person in one grid.You can assume the Ps must stand on '.' . so ,it also costs you 1 MV to enter this grid.
 
Input
The first line of the inputs is T, which stands for the number of test cases you need to solve.
Then T cases follow:
Each test case starts with a line contains three numbers N,M and MV (2<= N , M <=100,0<=MV<= 65536) which indicate the size of the map and Y's MV.Then a N*M two-dimensional array follows, which describe the whole map.
 
Output
Output the N*M map, using '*'s to replace all the grids 'Y' can arrive (except the 'Y' grid itself). Output a blank line after each case.
 
Sample Input
5 3 3 100 ... .E. ..Y 5 6 4 ...... ....PR ..E.PY ...ETT ....TT 2 2 100 .E EY 5 5 2 ..... ..P.. .PYP. ..P.. ..... 3 3 1 .E. EYE ...
 
Sample Output
... .E* .*Y ...*** ..**P* ..E*PY ...E** ....T* .E EY ..*.. .*P*. *PYP* .*P*. ..*.. .E. EYE .*.
 
Author
shǎ崽
 
Source
 
 
 

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
char  map1[105][105],ans[105][105];
int m,n,mv;
 int startx,starty;
int count1[105][105];
int NEXT[4][2]={1,0,0,-1,-1,0,0,1};
struct node
{
    int x;
    int y;
    int s;
}q1,q2;
 queue<node>qu;
int calulate(int x1,int y1,int v)
{
    int tx,ty,ret;
    if( map1[x1][y1]=='T')
        ret=v-2;
    else  if( map1[x1][y1]=='R')
        ret=v-3;
    else
        ret=v-1;
    for(int i=0;i<=3;i++)
    {
        tx=x1+NEXT[i][0];
        ty=y1+NEXT[i][1];
        if(tx<1||tx>m||ty<1||ty>n)
           continue;
        if( map1[tx][ty]=='E')
            {
                if(ret>0)
                return 0;
                else
                    return ret;
            }
    }
    return ret;
}

void bfs()
{

q1.x=startx;
    q1.y=starty;
    q1.s=mv;
    qu.push(q1);
    count1[startx][starty]=mv;
    while(!qu.empty())
    {
        q1=qu.front();
        qu.pop();
        if(q1.s==0)
            continue;
        for(int k=0;k<=3;k++)
        {
            q2.x=q1.x+NEXT[k][0];
            q2.y=q1.y+NEXT[k][1];
            if(q2.x<1||q2.x>m||q2.y<1||q2.y>n)
            continue;
           if( map1[q2.x][q2.y]=='#'|| map1[q2.x][q2.y]=='Y'|| map1[q2.x][q2.y]=='E')
           continue;
           q2.s=calulate(q2.x,q2.y,q1.s);
           if(q2.s<0)
            continue;
           if(q2.s>count1[q2.x][q2.y])
           {
               count1[q2.x][q2.y]=q2.s;
               qu.push(q2);
               if( map1[q2.x][q2.y]!='P')
                ans[q2.x][q2.y]='*';
           }
        }
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(count1,-1,sizeof(count1));
        memset( map1,0,sizeof( map1));
        memset(ans,0,sizeof(ans));

scanf("%d%d%d",&m,&n,&mv);
        getchar();

for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
                {
                    scanf("%c",&map1[i][j]);
                    ans[i][j]= map1[i][j];
                    if( map1[i][j]=='Y')
                    {
                        startx=i;
                        starty=j;
                    }

}
                getchar();
        }

bfs();
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
                printf("%c",ans[i][j]);
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

 
 
 
 

HDU3345广搜 (P,E,T,#)的更多相关文章

  1. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  2. HDU 5652(二分+广搜)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...

  3. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  4. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  5. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  6. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  7. 广搜+打表 POJ 1426 Find The Multiple

    POJ 1426   Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25734   Ac ...

  8. 双向广搜 codevs 3060 抓住那头奶牛

    codevs 3060 抓住那头奶牛 USACO  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold   题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...

  9. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

随机推荐

  1. HTML5——地图应用

    我们就拿百度地图举例吧: 废话少说,直接上Demo 简要截图如下:' 简要代码如下: <!DOCTYPE html> <html> <head> <title ...

  2. SDAutolayout图片大小根据数量变化

    只需要在自定义的PhotoContainerView中做一下判断就可以了 ) { [self setupAutoWidthFlowItems:[temp copy] withPerRowItemsCo ...

  3. 【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树

    sunshine的A题我竟然调了一周!!! 把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,, 这周我一直在调这个题,总结一下智障错误: 1.倍增的范围设成了n而 ...

  4. 使用NHibernate实现存储库

    ORM框架不是存储库.存储库是一种架构模式,而ORM是将数据模型表示成对象模型的一种手段. 存储库可以使用ORM来协助充当领域模型和数据模型之间的中介. NHibernate允许在不损坏或只少量损坏领 ...

  5. Lucene 4.7 --创建索引

    Lucene的最新版本和以前的语法或者类名,类规定都相差甚远 0.准备工作: 1). Lucene官方API http://lucene.apache.org/core/4_7_0/index.htm ...

  6. python逐行读写

    代码: fileReadObj = open("input.txt") fileWriteObj = open("output.txt", 'w') fileL ...

  7. Cocos2d-X3.0 刨根问底(五)----- Node类及显示对象列表源码分析

    上一章 我们分析了Cocos2d-x的内存管理,主要解剖了 Ref.PoolManager.AutoreleasePool这三个类,了解了对象是如何自动释放的机制.之前有一个类 Node经常出现在各种 ...

  8. 关于bash的shellshock漏洞

    这一漏洞的描述如下: Shellshock (CVE-2014-6271, CVE-2014-6277, CVE-2014-6278, CVE-2014-7169, CVE-2014-7186, CV ...

  9. Java创建目录 mkdir与mkdirs的区别

    两者的参数都是路径串,但: mkdir只能创建父目录存在的目录,而mkdirs不论要创建目录的父目录是否存在都能创建成功. 例如:假设目录c:/uses/zsm/desktop/dir1不存在,,现在 ...

  10. Python序列的切片操作与技巧

    切片操作 对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]. start_index: 表示是第一个元素对象,正索引位置 ...