Aizu - 0558 Cheese (bfs)
2015-03-28 18:30
148 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=49879
在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。
老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。
输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞, 1-N代表硬度为1-N的奶酪的工厂。(中文翻译参考了http://bbs.byr.cn/#!article/ACM_ICPC/73337?au=Milrivel)
思路:老鼠必须从硬度小的开始吃,这样才能有体力去吃其他硬度大的奶酪。这样就是求老鼠分别到各个点的最短路即可。
View Code
在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。
老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。
输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞, 1-N代表硬度为1-N的奶酪的工厂。(中文翻译参考了http://bbs.byr.cn/#!article/ACM_ICPC/73337?au=Milrivel)
思路:老鼠必须从硬度小的开始吃,这样才能有体力去吃其他硬度大的奶酪。这样就是求老鼠分别到各个点的最短路即可。
#include <iostream> #include <cstdio> //#include <cmath> #include <vector> #include <cstring> #include <string> #include <algorithm> #include <string> #include <set> #include <functional> #include <numeric> #include <sstream> #include <stack> #include <map> #include <queue> #define CL(arr, val) memset(arr, val, sizeof(arr)) #define ll long long #define inf 0x7f7f7f7f #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define L(x) (x) << 1 #define R(x) (x) << 1 | 1 #define MID(l, r) (l + r) >> 1 #define Min(x, y) (x) < (y) ? (x) : (y) #define Max(x, y) (x) < (y) ? (y) : (x) #define E(x) (1 << (x)) #define iabs(x) (x) < 0 ? -(x) : (x) #define OUT(x) printf("%I64d\n", x) #define lowbit(x) (x)&(-x) #define Read() freopen("a.txt", "r", stdin) #define Write() freopen("dout.txt", "w", stdout); #define maxn 1000000000 #define N 1010 using namespace std; int h,w,x; int dir[4][2]={-1,0,0,1,0,-1,1,0}; typedef pair<int,int> P; //pair表示状态 char maze ; int d ; P p; int bfs(char c) { queue<P>que; for(int i=0;i<h;i++) //首先把距离初始为无穷大,然后不断更新最小值 for(int j=0;j<w;j++) d[i][j]=maxn; que.push(p); d[p.first][p.second]=0; //起点的距离为0 P p1,p2; while(que.size()) { p1=que.front(); que.pop(); if(maze[p1.first][p1.second]==c) { p=p1; break; //找到终点 } for(int i=0;i<4;i++) { p2.first=p1.first+dir[i][0]; p2.second=p1.second+dir[i][1]; if(p2.first>=0&&p2.first<h&&p2.second>=0&&p2.second<w&&maze[p2.first][p2.second]!='X'&&d[p2.first][p2.second]==maxn) { //判断是否可以移动以及是否访问过 d[i][j]!=maxn即访问过 que.push(p2); d[p2.first][p2.second]=d[p1.first][p1.second]+1; } } } return d[p.first][p.second]; } int main() { //freopen("a.txt","r",stdin); while(~scanf("%d%d%d",&h,&w,&x)) { getchar(); int sum=0; for(int i=0;i<h;i++) { scanf("%s",maze[i]); //printf("%s\n",maze[i]); for(int j=0;j<w;j++) { if(maze[i][j]=='S') { p.first=i; p.second=j; } } } //printf("%d %d\n",p1.first,p1.second); for(int i=1;i<=x;i++) //x个点,x个bfs { sum+=bfs('0'+i); } printf("%d\n",sum); } return 0; }
View Code
相关文章推荐
- Aizu-0558 Cheese
- AOJ 0558 Cheese (bfs)
- Aoj 0558 Cheese【bfs分段处理】
- Aizu 0558 Cheese
- AOJ 0558 Cheese【BFS】
- [bfs]AOJ 0558 Cheese
- AOJ-0558 Cheese BFS
- AOJ 0558 Cheese (BFS)
- AOJ 0558:Cheese(bfs)
- AOJ 0558 BFS
- Aizu 2677 Breadth-First Search by Foxpower(LCA + BFS)
- AOJ0558 Cheese【BFS】
- Aizu 1296 简单bfs
- Aizu - 2783 Help the Princess!(BFS)
- Aizu 0558
- Cheese Aizu - 0558-bfs
- Aizu 0121 Seven Puzzle (康托展开+bfs)
- AOJ0558(cheese, BFS)
- (BFS)aoj0558-Cheese
- AOJ0558——Cheese(BFS)