LightOJ 1012 简单bfs,水

1、LightOJ 1012  Guilty Prince  简单bfs

2、总结:水

题意:迷宫,求有多少位置可去

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
#define F(i,a,b) for (int i=a;i<=b;i++)
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const int N=25;

struct Point
{
    int x,y;
};

char mapn[N][N];
int visit[N][N];
int w,h,ii,jj;
int dirw[4]={0,0,1,-1};
int dirh[4]={1,-1,0,0};

bool charge(Point e)
{
    if(e.x>=0&&e.x<h&&e.y>=0&&e.y<w&&!visit[e.x][e.y]&&mapn[e.x][e.y]==‘.‘)
        return true;
    return false;
}

int dfs()
{
    int ans=1;
    Point st,en;
    queue<Point>q;
    st.x=ii,st.y=jj;

    q.push(st);
    while(!q.empty()){
        st=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            en.x=st.x+dirh[i];
            en.y=st.y+dirw[i];
            if(charge(en)){
                q.push(en);
                visit[en.x][en.y]=1;
                ans++;
            }
        }
    }
    return ans;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int cas=1;cas<=n;cas++)
    {
        memset(visit,0,sizeof(visit));
        scanf("%d%d",&w,&h);
        for(int i=0;i<h;i++){
            scanf("%s",mapn[i]);  //从0开始,故下面j要注意
            for(int j=0;j<w;j++){
                if(mapn[i][j]==‘@‘)
                    ii=i,jj=j,visit[i][j]=1;
            }
        }
        int ans=dfs();
        printf("Case %d: %d\n",cas,ans);
    }

    return 0;
}

时间: 2024-10-11 04:49:19

LightOJ 1012 简单bfs,水的相关文章

POJ3185(简单BFS,主要做测试使用)

没事做水了一道POJ的简单BFS的题目 这道题的数据范围是20,所以状态总数就是(1<<20) 第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实这里我是很不明白的,,TM状态总数就只有1e6怎么也不应该超时的,,,,只能说STL的queue的常数实在是太大,完全没法弄...) 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <qu

POJ 3278 Catch That Cow --- 简单BFS

/* POJ 3278 Catch That Cow --- 简单BFS */ #include <cstdio> #include <queue> #include <cstring> using namespace std; const int maxn = 100005; bool visit[maxn]; int step[maxn]; int bfs(int n, int k){ if (n == k) return 0; memset(visit, 0, s

【POJ 3669 Meteor Shower】简单BFS

流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封锁).安全地带为永远不会被封锁的点. 简单bfs,开始WA在把平面空间上限当成300*300,但根据题目,这只是有流星雨撞击的范围.实际可走的空间理论上没上限,但分析可得,离原点最近的安全地带一定在(302,302)范围内,所以应可把数组至少开为303*303. 后来WA在把G[0][0]==1的情

hdu 1312 Red and Black(BFS水题)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9684    Accepted Submission(s): 6021 Problem Description There is a rectangular room, covered with square tiles. Each tile is colore

HDU 1548 A strange lift(Dijkstra,简单BFS)

题目大意: 电梯有两个选项向上或向下,每层楼有一个参数ki,代表电梯可以再该楼层的基础上向上或向下移动ki层,限制条件是向上不能超过楼层总数n,向下不能少于一.输入总层数n和当前所在层数以及目标层数,然后是n个数分别代表第i层的移动范围.输出最少移动次数,若不可达,输出-1. 解题思路: 1.用Dijkstra算法,首先构建邻接矩阵,注意在构造时,要考虑i-k[i]<1和i+k[i]>n,i代表当前所在层. 1 #include<string.h> 2 #include<st

poj 1562 简单 bfs

// 简单 bfs #include <iostream>#include<fstream>using namespace std; char map[110][110];int flag[110][110];int qu[11000][2],qe,qs,m,n;int add[8][2]={-1,-1,  -1,0, -1,1,   0,-1,  0,1,  1,-1,    1,0,   1,1 }; void bfs(int r,int c){    int i,tr,tc;

HDU 5012 BFS水

2014 ACM/ICPC Asia Regional Xi'an Online 对于一个筛子,规定了以底面的四个边为轴,可以进行翻转,给出起始状态,求最少步骤到目标状态. 简单BFS #include "stdio.h" #include "string.h" #include "math.h" #include "queue" using namespace std; struct node { int s[7]; int

逃脱 (简单BFS)

题目传送门 G逃脱  题目描述 这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的mengxiang000和Tabris听到了火灾警报声的同时拔腿就跑,不知道两人是否能够逃脱险境? 幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素: “.”:表示这是一块空地,是可以随意穿梭的. “#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁. “S”:表示men

暑期训练狂刷系列——Lightoj 1084 - Winter bfs

题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1084 题目大意: 有n个点在一条以零为起点的坐标轴上,每个点最多可以移动k,问最终能不能把所有点都聚集在大于等于三个点的集合里面,如果能最少需要几个这样的集合? 解题思路: 刚开始看到题目感觉好简单,就开始了sort然后贪心之旅,这就是错误的开始.最后发现这样并不行,然后再Alex的提醒下想用单调队列优化,在我愚昧的理解下竟然写成了bfs,提交竟然ac了,surprise~