Codeforces Round #192 (Div. 1) B. Biridian Forest(BFS)
2015-11-06 21:06
471 查看
题目链接
题意:就是在n*m的图里面,从S出发到E,然后数字表示那个格子有几个人,T表示是树,不能走。最后问你有几个人会比你先离开。
解答:从E出发BFS
题意:就是在n*m的图里面,从S出发到E,然后数字表示那个格子有几个人,T表示是树,不能走。最后问你有几个人会比你先离开。
解答:从E出发BFS
#include<bits/stdc++.h> using namespace std; #define LL long long #define pb push_back #define X first #define Y second #define cl(a,b) memset(a,b,sizeof(a)) typedef pair<int,int> P; const int maxn=1005; const int inf=1<<27; char mp[maxn][maxn]; int n,m; int si,sj,ei,ej; int dir[][2]={1,0,0,1,-1,0,0,-1}; bool vis[maxn][maxn]; int dis[maxn][maxn]; void bfs(){ queue<P> q; q.push(P(ei,ej)); cl(vis,false); vis[ei][ej]=true; dis[ei][ej]=0; while(!q.empty()){ P t=q.front();q.pop(); for(int i=0;i<4;i++){ int xx=t.X+dir[i][0]; int yy=t.Y+dir[i][1]; if(xx>=n||xx<0||yy>=m||yy<0||vis[xx][yy]||mp[xx][yy]=='T')continue; q.push(P(xx,yy)); vis[xx][yy]=true; dis[xx][yy]=dis[t.X][t.Y]+1; } } } int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ scanf("%s",mp[i]); for(int j=0;j<m;j++){ if(mp[i][j]=='S'){ si=i;sj=j; } if(mp[i][j]=='E'){ ei=i;ej=j; } dis[i][j]=inf; } } bfs(); int sum=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++)if(mp[i][j]>='0'&&mp[i][j]<='9'){ if(dis[i][j]<=dis[si][sj])sum+=mp[i][j]-'0'; } } printf("%d\n",sum); return 0; }
相关文章推荐
- KVO内部实现原理
- Notepad++官网地址 https://notepad-plus-plus.org/
- centos 6.6下安装nginx
- 命令 touch
- 南阳OJ 2 括号配对问题
- Wordpress的主题安装
- Nginx1.8.0 编译安装
- 关于zabbix通过jmx监控tomcat的问题
- 【c++】容器vector
- android studio error:'D:\ProgramSoft\android-ndk-r10e\ndk-build.cmd'' finished with non-zero exit
- 1100 Mars Numbers
- 成长编码1
- excel排版成印刷版格式:批量转换成pdf
- CAShapeLayer
- 1093 count PAT's
- 操作系统的历史 History of OS part 1
- 红黑树的插入C实现
- 栈的顺序
- 【小松教你手游开发】【unity实用技能】unity 内存调试方法
- 边界值