zoukankan      html  css  js  c++  java
  • codevs 1536 海战

    所谓灌水法?其实就是一个bfs了。

    注意此题要求判断是否合法,只需要记录经过的点数,判断它是否是矩形的面积即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cmath>
    using namespace std;
    bool vis[1005][1005];
    int n,m,map[1005][1005],flag=0,cnt=0;
    int dx[]={0,0,1,0,-1},dy[]={0,1,0,-1,0};
    struct code
    {
    int x,y;
    };
    queue <code> q;
    char s[1005];
    bool judge(int x,int y)
    {
    if ((x>=1) && (x<=n) && (y>=1) && (y<=m) && (map[x][y]==1) && (vis[x][y]==false))
    return true;
    return false;
    }
    void bfs(int bx,int by)
    {
    int cc=1,maxx=bx,maxy=by;
    while (!q.empty())
    q.pop();
    code begin;
    begin.x=bx;begin.y=by;
    q.push(begin);
    vis[bx][by]=true;
    while (!q.empty())
    {
    code head=q.front();
    q.pop();
    for (int i=1;i<=4;i++)
    {
    if (judge(head.x+dx[i],head.y+dy[i])==true)
    {
    cc++;
    maxx=max(maxx,head.x+dx[i]);
    maxy=max(maxy,head.y+dy[i]);
    code now;
    now.x=head.x+dx[i];now.y=head.y+dy[i];
    vis[now.x][now.y]=true;
    q.push(now);
    }
    }
    }
    if ((maxx-bx+1)*(maxy-by+1)!=cc) flag=1;
    }
    int main()
    {
    memset(vis,false,sizeof(vis));
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    {
    scanf("%s",s);
    for (int j=0;j<m;j++)
    {
    if (s[j]=='.') map[i][j+1]=0;
    else map[i][j+1]=1;
    }
    }
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    if ((vis[i][j]==false) && (map[i][j]==1))
    {
    cnt++;
    bfs(i,j);
    if (flag==1)
    {
    printf("Bad placement. ");
    return 0;
    }
    }
    printf("There are %d ships. ",cnt);
    return 0;
    }

  • 相关阅读:
    装饰器 如何理解Python装饰器?
    python装饰器详解
    window 10下安装jdk
    Linux中pam认证详解(上)
    VMware/KVM/OpenStack虚拟化之网络模式总结
    java问题排查命令
    今日面试问题
    Qwtplot3D Qt5.12.0 MinGW 编译运行
    20212022年寒假学习进度06
    Springboot笔记<10>常用注解总结
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5179405.html
Copyright © 2011-2022 走看看