码迷,mamicode.com
首页 > 其他好文 > 详细

1536 海战

时间:2016-06-14 11:43:37      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

 

技术分享

以为求有几个连通块,~~这都A了5个点

#include<cstdio>
#include<iostream>
using namespace std;
char map[110][110];
int n,m,ans,vis[110][110];
void dfs(int i,int j){
    if(i<1||j<1||i>n||j>m) return ;
    if(vis[i][j]) return ;
    if(!vis[i][j]){
        vis[i][j]=1;
        if(map[i][j]==#){
            int f1=0,f2=0,f3=0,f4=0;
            if((map[i+1][j]==#&&!vis[i+1][j])||map[i+1][j]!=#) f1=1;
            if((map[i-1][j]==#&&!vis[i-1][j])||map[i-1][j]!=#) f2=1;
            if((map[i][j+1]==#&&!vis[i][j+1])||map[i][j+1]!=#) f3=1;
            if((map[i][j-1]==#&&!vis[i][j-1])||map[i][j-1]!=#) f4=1;
            if(f1&&f2&&f3&&f4) ans++;
        }
    }
    dfs(i+1,j);
    dfs(i,j+1);
    dfs(i-1,j);
    dfs(i,j-1);
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>map[i][j];
    dfs(1,1);
    if(ans) printf("There are %d ships.\n",ans);
    else printf("Bad placement.\n");
    return 0;
} 

 

技术分享

读明白题目了,dfs却超时

#include<cstdio>
#include<iostream>
using namespace std;
const int dx[2]={0,1};
const int dy[2]={1,0};
char map[1010][1010];
int n,m,ans,vis[1010][1010];
int flag;
void dfs(int i,int j,int num){
    if(i<1||j<1||i>n||j>m||flag) return ;
    if(vis[i][j]&&vis[i][j]!=num){flag=1;return ;}
    vis[i][j]=num;
    for(int k=0;k<2;k++){
        int x=i+dx[k],y=j+dy[k];
        if(map[x][y]==#&&vis[x][y]>=0){
            dfs(x,y,num);
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>map[i][j];
    for(int i=1;i<=n&&!flag;i++){
        for(int j=1;j<=m&&!flag;j++){
            if(map[i][j]==#&&map[i+1][j]==#&&map[i][j+1]==#)
                if((map[i+1][j+1]==#||map[i-1][j-1]==#||map[i+1][j-1]==#||map[i-1][j+1]==#));
                else{
                    flag=1;break;
                }
            if(map[i][j]==#&&!vis[i][j]){
                ans++;
                dfs(i,j,ans);
            }
        }
    }
    if(!flag) printf("There are %d ships.\n",ans);
    else printf("Bad placement.\n");
    return 0;
} 

 

去网上搜了一下,大多用bfs过,跟一下

题解:

虽然说是一道白银,但是我刚看到的时候还是要有思路啊!!

遍历矩阵,找一个没到过的格子(xx,yy)作为当前矩形的左上角,开始BFS,如果过程中出现x< xx||y< yy的话就是不可能的(手画一下就可以看出),如果没有出现这样的情况,就记录x坐标,y坐标的最大值maxx,maxy,然后记录一下到过的格子数cnt,如果cnt==(maxx-xx+1)*(maxy-yy+1)说明这个矩形是满的,当前矩形符合要求,一个一个找就行了

AC代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1010
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
char map[N][N];
int vis[N][N],n,m;
struct node{
    int x,y;
   node(int x=0,int y=0):x(x),y(y){}
};
int inside(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;}
int bfs(int xx,int yy){
    int maxx=xx,maxy=yy,cnt=0;
    queue<node>q;
    q.push(node(xx,yy));
    vis[xx][yy]=1;
    while(!q.empty()){
        node k=q.front();q.pop();
        cnt++;
        for(int i=0;i<4;i++){
            int nx=k.x+dx[i],ny=k.y+dy[i];
            if(inside(nx,ny)&&map[nx][ny]==#&&!vis[nx][ny]){
                vis[nx][ny]=1;
                maxx=max(maxx,nx);
                maxy=max(maxy,ny);
                q.push(node(nx,ny));
                if(nx<xx||ny<yy) return 0;
            }
        }
    }
    if(cnt==(maxx-xx+1)*(maxy-yy+1)) return 1;
    return 0;
}

int main()
{
    cin>>n>>m;
    int cnt=0;
    for(int i=1;i<=n;i++)scanf("%s",map[i]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(!vis[i][j]&&map[i][j]==#) 
                if(!bfs(i,j)){
                    printf("Bad placement.\n");return 0;
                }
                else cnt++;
    printf("There are %d ships.",cnt);
    return 0;
}

 

1536 海战

标签:

原文地址:http://www.cnblogs.com/shenben/p/5583276.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!