ZCMU—1676

来源:互联网 发布:网络拓扑设计文档 编辑:程序博客网 时间:2024/06/05 03:36

1676: 回城加血

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 116  Solved: 19
[Submit][Status][Web Board]

Description

最近卡斯丁狗爱上了‘我的世界’ 这个游戏,一直在里面挖矿,种地,养牛,造铁轨等,还经常邀请double x,ayer等很多基友去他的世界玩。这一天。他们发现了一大片树林,然后忍不住的去开始砍,但是砍着砍着天都黑了,正如你所知,黑夜是那么的口怕,关键是他们出来砍树为了节省背包,没有带床,只好自己回家睡觉。卡斯丁狗 想知道有几个人不比他晚到家。他们砍树的区域是n*m的矩形,‘S'表示卡斯丁狗的位置,’E‘表示家的位置,’.‘表示是可以走的平地,'T'表示是树,不能走,数字x表示的是那个位置有x个卡斯丁狗的基友。(当然数字位置也是可以走的,某点可以到达与他有边相连的位置)

Input

一行 n,m.接下来是n*m的图.(n,m<=1000)

Output

输出一个数,表示不比卡斯丁狗晚到家的基友数

Sample Input

5 7
000E0T3
T0TT0T0
010T0T0
2T0T0T0
0T0S000
1 4
SE23

Sample Output

3
2
【分析】
反过来搜家到每个点的距离,然后遍历一边地图看有多少个有人的点并且距离比S远....
基本的bfs
【代码】
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <queue>using namespace std; struct xx{    int x,y;}now,start,go; int dis[1010][1010];int vis[1010][1010];char a[1010][1010];int dx[10]={1,-1,0,0};int dy[10]={0,0,1,-1};int n,m,ex,ey; void bfs(){    queue<xx> q;    memset(dis,0,sizeof(dis));    memset(vis,0,sizeof(vis));    q.push(start);    vis[start.x][start.y]=1;    dis[start.x][start.y]=0;    while (!q.empty())    {        now=q.front();        q.pop();        for (int i=0;i<4;i++)        {            go.x=now.x+dx[i];            go.y=now.y+dy[i];            if (go.x>=0&&go.x<n&&go.y>=0&&go.y<m&&vis[go.x][go.y]==0&&a[go.x][go.y]!='T')            {                q.push(go);                vis[go.x][go.y]=1;                dis[go.x][go.y]=dis[now.x][now.y]+1;            }        }    }}  int main(){    while (~scanf("%d%d",&n,&m))    {        for (int i=0;i<n;i++)        {            scanf("%s",a[i]);            for (int j=0;j<m;j++)                if (a[i][j]=='E')                {                    start.x=i;                    start.y=j;                }                else                if (a[i][j]=='S')                {                    ex=i;                    ey=j;                   }         }        bfs();        /*printf("%d %d\n",start.x,start.y);        for (int i=0;i<n;i++)        {            for (int j=0;j<m;j++)                printf("%d",dis[i][j]);            puts("");        } */        int ans=0;        for (int i=0;i<n;i++)            for (int j=0;j<m;j++)                if (a[i][j]>'0'&&a[i][j]<='9'&&dis[i][j]<=dis[ex][ey]&&dis[i][j]!=0)                    ans+=a[i][j]-48;        printf("%d\n",ans);    }    return 0;   } 


0 0