FZU 2150 枚举+BFS

题意

给个N*M的田地,有些地方是草地有些是空地,现在有两个小孩,开始放火。放火只能在草地上进行,并且第一块点火的草地烧掉不需要时间,且每一块着火的草地,每一秒都会点着烧掉周围四块草地。问两个小孩最少要多少时间能把这片田地上的草烧完。每个小孩只有一次放火机会。

分析

N , M 不会很大,直接枚举两个人点的草地位置,分别bfs,在所有解里取最小值即可。

代码1

/* When all else is lost the future still remains. */
/* You can be the greatest */
#define rep(X,Y,Z) for(int X=(Y);X<(Z);X++)
#define drep(X,Y,Z) for(int X=(Y);X>=(Z);X--)
#define fi first
#define se second
#define mk(X,Y) make_pair((X),(Y))
#define inf 0x3f3f3f3f
#define clr(X,Y) memset(X,Y,sizeof(X))
#define pb push_back
//head
#include <iostream>
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <string>
#include <map>
#include <string.h>
using namespace std;
#define maxN 15
#define maxM 15
int dx[] = {-1,0,1,0};
int dy[] = {0,-1,0,1};
int val[2][maxN][maxM];
int mark[2][maxN][maxM];
bool mp[maxN][maxM];
int n , m;
int check_val(int,int);

int check_val(int n , int m){
    int ans = 0;
    rep(i,1,n+1) rep(j,1,m+1){
        if(mp[i][j]){
            ans = max(ans,min(val[1][i][j],val[0][i][j]));
        }
    }
    return ans;
}
int dfs(int x , int y , int cnt){
    queue<pair<int,int> > Q;
    val[cnt][x][y] = 0;
    mark[cnt][x][y] = 1;
    Q.push(mk(x,y));
    while(!Q.empty()){
        int nx = Q.front().fi;
        int ny = Q.front().se;
        Q.pop();
        rep(i,0,4){
            int tx = nx + dx[i];
            int ty = ny + dy[i];
            if(!mp[tx][ty]) continue;
            if(mark[cnt][tx][ty]) continue;
            val[cnt][tx][ty] = val[cnt][nx][ny] + 1;
            mark[cnt][tx][ty] = 1;
            Q.push(mk(tx,ty));
        }
    }
    if(cnt == 1) return check_val(n,m);
    int ans = inf;
    rep(i,x,n+1){
        int t = (i == x) ? (y) : 1;
        rep(j,t,m+1){
            if(mp[i][j]){
                rep(k,1,n+1) rep(l,1,m+1) mark[1][k][l] = 0;
                rep(k,1,n+1) rep(l,1,m+1) val[1][k][l] = inf;
                ans = min(ans,dfs(i,j,1));
                
            }
        }
    }
    return ans;
}
int main(){
    int T;
    while(~scanf("%d",&T)) rep(ca,1,T+1){
        clr(mp,0);
        scanf("%d %d\n",&n,&m);
        char t;
        rep(i,1,n+1) {
            rep(j,1,m+1){
                scanf("%c",&t);
                mp[i][j] = (t == '.') ? 0 : 1;
            }
            getchar();
        }
        
        int ans = inf;
        rep(i,1,n+1) rep(j,1,m+1){
            if(mp[i][j]){
                clr(val,inf);
                clr(mark,0);
                ans = min(ans,dfs(i,j,0));
            }
        }
        printf("Case %d: %d\n",ca,(ans>=inf)?-1:ans);

    }

    return 0;
}

 

代码2

 1 /* When all else is lost the future still remains. */
 2 /* You can be the greatest */
 3 #define rep(X,Y,Z) for(int X=(Y);X<(Z);X++)
 4 #define drep(X,Y,Z) for(int X=(Y);X>=(Z);X--)
 5 #define fi first
 6 #define se second
 7 #define mk(X,Y) make_pair((X),(Y))
 8 #define inf 0x3f3f3f3f
 9 #define clr(X,Y) memset(X,Y,sizeof(X))
10 #define pb push_back
11 //head
12 #include <iostream>
13 #include <stdio.h>
14 #include <queue>
15 #include <algorithm>
16 #include <string>
17 #include <map>
18 #include <string.h>
19 using namespace std;
20 #define maxN 20
21 #define maxM 20
22 int dx[] = {-1,0,1,0};
23 int dy[] = {0,-1,0,1};
24 int n , m;
25 bool mp[maxN][maxM];
26 int val[2][maxN][maxM];
27 bool mark[2][maxN][maxM];
28 void init(int cnt){
29     rep(i,1,n+1) rep(j,1,m+1){
30         val[cnt][i][j] = inf;
31         mark[cnt][i][j] = 0;
32     }
33     return ;
34 }
35 int check_val(){
36     int ans = 0;
37     rep(i,1,n+1) rep(j,1,m+1){
38         if(mp[i][j]) ans = max(ans,min(val[0][i][j],val[1][i][j]));
39     }
40     return ans;
41 }
42 void bfs(int x , int y , int cnt){
43     queue<pair<int,int> > Q;
44     Q.push(mk(x,y));
45     mark[cnt][x][y] = 1;
46     val[cnt][x][y] = 0;
47     while(!Q.empty()){
48         int nx = Q.front().fi;
49         int ny = Q.front().se;
50         Q.pop();
51         rep(i,0,4){
52             int tx = nx + dx[i];
53             int ty = ny + dy[i];
54             if(!mp[tx][ty]) continue;
55             if(mark[cnt][tx][ty]) continue;
56             val[cnt][tx][ty] = val[cnt][nx][ny] + 1;
57             mark[cnt][tx][ty] = 1;
58             Q.push(mk(tx,ty));
59         }
60     }
61 }
62 int main(){
63 
64     int T;
65     scanf("%d",&T);
66     rep(ca,1,T+1){
67         int ans = inf;
68         clr(mp,0);
69         scanf("%d %d\n",&n,&m);
70         char t;
71         rep(i,1,n+1) {
72             rep(j,1,m+1){
73                 scanf("%c",&t);
74                 mp[i][j] = (t == '.') ? 0 : 1;
75             }
76             getchar();
77         }
78         rep(rx,1,n+1) rep(ry,1,m+1){
79             if(!mp[rx][ry]) continue;
80             init(0); init(1);
81             bfs(rx,ry,0);
82             rep(ax,rx,n+1){
83                 int t = (ax == rx) ? ry : 1;
84                 rep(ay,t,m+1){
85                     if(!mp[ax][ay]) continue;
86                     init(1);
87                     bfs(ax,ay,1);
88                     ans = min(ans,check_val());
89                 }
90             }
91         }
92         printf("Case %d: %d\n",ca,(ans>=inf)?-1:ans);
93 
94     }
95     return 0;
96 }

 

转载于:https://www.cnblogs.com/ticsmtc/p/5965829.html

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值