zoukankan      html  css  js  c++  java
  • FZU 2150 Fire Game bfs

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103921#problem/I

    bfs水题。好像还做过一次了。思路题意都见代码吧~

      1 /*
      2 大意是给一个n*m的图。#表示长草,.表示空着,开始可以同时点燃两个格子里面的草,一秒钟蔓延到上下左右相邻的格子。
      3 空格不会有火。不能隔着格子蔓延。问是否能够让草的区域全部着火。如果能输出用的最少的时间。
      4 不知道思路从哪里来的。暴力。先判断有几个连通区域。如果>2,不可能。=2 两个区域分别找最短时间相加。=1.两重循环找最短时间、
      5 无脑。
      6 无脑卡壳了。不知道怎么实现。首先是计算有几个区域,广搜?可以。然后 == 2计算最短时间的时候,广搜一遍?然后=1 ,,依然是广搜.可行就是觉得麻烦。
      7 然后。小王sir果断告诉了我新的思路。两重循环任意两个草的位置为起点,搜索,从所有可能的结果中找最小值就可以了。我T_T。
      8 */
      9 
     10 #include <stdio.h>
     11 #include <string.h>
     12 #include <iostream>
     13 #include <queue>
     14 #define maxn 1000000
     15 using namespace std;
     16 
     17 struct Node {
     18     int x, y;
     19 }node[10000];
     20 
     21 queue<Node>que;
     22 int vis[20][20];
     23 int step[20][20];
     24 int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
     25 int n, m;
     26 int cnt;
     27 bool viss[20][20];
     28 
     29 bool check(Node a) {
     30     int x = a.x, y = a.y;
     31     if (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] && viss[x][y]) {
     32         return true;
     33     }
     34     return false;
     35 }
     36 
     37 bool checkAll() {
     38     for (int i=0; i<cnt; ++i) {
     39         if (step[node[i].x][node[i].y] == maxn)
     40             return false;
     41     }
     42     return true;
     43 }
     44 
     45 
     46 int bfs(int ii, int jj) {
     47     while(!que.empty()) {
     48         que.pop();
     49     }
     50     memset(vis, 0, sizeof(vis));
     51 
     52     for (int i=0; i<n; ++i) {
     53         for (int j=0; j<m; ++j) {
     54             step[i][j] = maxn;
     55         }
     56     }
     57     que.push(node[ii]);
     58     que.push(node[jj]);
     59     vis[node[ii].x][node[ii].y] = 1;
     60     vis[node[jj].x][node[jj].y] = 1;
     61     step[node[ii].x][node[ii].y] = 0;
     62     step[node[jj].x][node[jj].y] = 0;
     63 
     64     while(!que.empty()) {
     65         Node now = que.front();
     66         que.pop();
     67         for (int i=0; i<4; ++i) {
     68             Node temp;
     69             temp.x = now.x + dir[i][0];
     70             temp.y = now.y + dir[i][1];
     71             if (check(temp)) {
     72                 que.push(temp);
     73                 vis[temp.x][temp.y] = 1;
     74                 step[temp.x][temp.y] = step[now.x][now.y] + 1;
     75             }
     76         }
     77         if (checkAll()) break;
     78     }
     79     if (!checkAll()) return maxn;
     80     int tempans = -1;
     81     for (int i=0; i<cnt; ++i) {
     82         tempans = max(step[node[i].x][node[i].y], tempans);
     83     }
     84     return tempans;
     85 }
     86 
     87 int main() {
     88     int t;
     89     char temp;
     90     cin >> t;
     91     int num = 0;
     92     while(t--) {
     93         Node now;
     94         cnt = 0;
     95         memset(viss, 0, sizeof(viss));
     96         cin >> n >> m;
     97         for (int i=0; i<n; ++i) {
     98             for (int j=0; j<m; ++j) {
     99                 cin >> temp;
    100                 if (temp == '#') {
    101                     now.x = i;
    102                     now.y = j;
    103                     viss[now.x][now.y] = 1;
    104                     node[cnt++] = now;
    105                 }
    106             }
    107         }
    108 
    109         int ans = maxn;
    110         for (int i=0; i<cnt; ++i) {
    111             for (int j=0; j<cnt; ++j) {
    112                 ans = min(bfs(i, j), ans);
    113             }
    114         }
    115 
    116         cout << "Case " << ++num << ": ";
    117         if (ans == maxn) {
    118             cout << -1 << endl;
    119         }
    120         else {
    121             cout << ans << endl;
    122         }
    123     }
    124     return 0;
    125 }
    View Code
  • 相关阅读:
    【phpmailer】类Could not instantiate mail function / IXWebHosting空间
    Delphi通过机器码获得注册码的完整方案
    月末使用期间损益结转
    如何停用已启用模块
    DevExpress安装
    用Delphi实现WinSocket高级应用
    如何用delphi读取网卡物理号
    Delphi制作带图标的弹出式选单
    Register Delphi ,Delphi 不能运行
    远程通:系统管理不可以使用
  • 原文地址:https://www.cnblogs.com/icode-girl/p/5158972.html
Copyright © 2011-2022 走看看