Fire Game FZU
来源:互联网 发布:pdu协议数据单元 编辑:程序博客网 时间:2024/06/02 04:54
这个题题意是两个人在草地上选两点为起点放火,问能不能把草地烧完,能的话画出最短的时间。做法就是选两个起点进行BFS,由于图比较小,可以直接枚举任意两个点进行BFS,选取最短时间
这是一个有两个起点的BFS,起初我是打算开两个队列,然后同时进行BFS,然后错了,,后来一想,即便是把所有的点都放在同一个队列里,也是相当于从两个点开始的BFS,然而还是Wrong,后来想是不是判断不能燃烧所有的草地那个地方错了,本来我是通过一个grass_num记录一共有多少块草地,然后每往队列里压入一个就自减,return的时候判断grass_num是不是为0,后来改成了遍历了。。遍历就过了
//leehaoze#include <iostream>#include <deque>#include <string>#include <vector>#include <queue>#include <cstdio>#include <stack>#include <algorithm>#include <cstring>#include <cctype>#include <cstdio>#include <cmath>#include <cstdlib>using namespace std;const int INF = 1 << 29;#define INC_SAT(val) (val = ((val)+1 > (val)) ? (val)+1 : (val))#define ARR_SIZE(a) ( sizeof( (a) ) / sizeof( (a[0]) ) )#define ULL unsigned long long#define MAXN (10 + 5)struct Pos { Pos(int x, int y, int step) : x_(x), y_(y), step_(step) {} int x_, y_, step_;};int Move_X[] = {0, 0, 1, -1};int Move_Y[] = {1, -1, 0, 0};int T;int N, M, grass_num;char map[MAXN][MAXN];bool visit[MAXN][MAXN];vector<Pos> V;void Input() { scanf("%d%d", &N, &M); getchar(); grass_num = 0; V.clear(); for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { scanf("%c", &map[i][j]); if (map[i][j] == '#') { grass_num++; V.push_back(Pos(i, j, 0)); } visit[i][j] = false; } getchar(); }}bool Legal(int dx, int dy) { return dx >= 0 && dx < N && dy >= 0 && dy < M && !visit[dx][dy] && map[dx][dy] == '#';}int BFS(Pos startA, Pos startB) { queue<Pos> Q; Q.push(startA); Q.push(startB); visit[startA.x_][startA.y_] = true; visit[startB.x_][startB.y_] = true; while (!Q.empty()) { Pos now = Q.front(); Q.pop(); for (int i = 0; i < 4; ++i) { int dx = now.x_ + Move_X[i]; int dy = now.y_ + Move_Y[i]; if (Legal(dx, dy)) { visit[dx][dy] = true; Q.push(Pos(dx, dy, now.step_ + 1)); } } if (Q.empty()) { return now.step_; } }}bool Judge() { for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { if (map[i][j] == '#' && !visit[i][j]) { return false; } } } return true;}void Clear_Visit() { for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { visit[i][j] = false; } }}void Enumerate() { int ans = MAXN * MAXN; int size = (int) V.size(); for (int i = 0; i < size; ++i) { for (int j = i; j < size; ++j) { Clear_Visit(); int temp = BFS(V[i], V[j]); if (Judge()) { ans = min(ans, temp); } } } if (ans == MAXN * MAXN) cout << -1 << endl; else cout << ans << endl;}int main() {#ifdef LOCAL freopen("IN.txt", "r", stdin);#endif std::ios::sync_with_stdio(false); scanf("%d", &T); getchar(); for (int i = 0; i < T; ++i) { Input(); cout << "Case " << i + 1 << ": "; Enumerate(); }}
0 0
- FZU 2150 Fire Game
- FZU 2150 Fire Game
- FZU 2150 Fire Game
- FZU 2150 Fire Game
- FZU:I. Fire Game
- FZU 2150 Fire Game
- FZU-2150 Fire Game
- fzu 2150 Fire Game
- FZU Fire Game
- FZU 2150 Fire Game
- FZU 2150 - Fire Game
- fzu 2150 Fire Game
- FZU 2150 Fire Game
- FZU 2150 Fire Game
- FZU 2150Fire Game
- FZU 2150 Fire Game
- FZU-2150-Fire Game
- FZU 2150 Fire Game
- TensorFlow高效读取数据——TFRecord
- YOLOv2 论文笔记
- Linux下的PHP安全要点
- 网站的视频文件如何每次播放都从服务器下载而不是播放本地缓存
- Java8初体验(二)Stream语法详解
- Fire Game FZU
- 【mysql】You must reset your password using ALTER USER statement before executing this statement.
- linux各硬件运行状态查看
- ShareSdk分享到微信好友或者是微信朋友圈提示"由于invalid_app无法分享到微信"
- 网络基础知识、linux路由管理命令(route) 、ip命令、ifconfig命令的使用、linux网卡配置
- CSS清除浮动
- 基础总结知识点-第六章:主流动态网页技术
- 解读《德勤2017年全球CIO报告》:顶级CIO的炼成之道
- Django新手图文教程