抄题解
  • 板块P1331 海战
  • 楼主npc000
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/1/2 18:56
  • 上次更新2024/1/2 19:01:47
查看原帖
抄题解
1234029
npc000楼主2024/1/2 18:56

CTGU_23_ck:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstdlib>
#include<algorithm>//文件头不解释
using namespace std;
int m,n,f[1005][1005],s,b[1005][1005],pd,lll;
int xx,dd,xb,db;
char a[1005][1005];//定义一堆变量
int bx[4]={0,0,-1,1};
int by[4]={-1,1,0,0};//控制当前位置上下左右的移动的数组,一个控制行,一个控制列
void dfs(int x,int y)//广度优先搜索
{
    if(x<1||x>n||y<1||y>m||f[x][y]==1||a[x][y]!='#')return ;//如果当前位置超过了边界或者访问过当前位置或者当前位置是水则返回上一次
    else//否则
    {
    a[x][y]='@';//当前位置设为@这个符号,也就是标记当前位置
    f[x][y]=1;//标记当前位置(是不是和上一个重复了?我不管)
    if(x>xx)xx=x;
    if(y>dd)dd=y;
    if(x<xb)xb=x;
    if(y<db)db=y;
    //这里是本程序的重点部分,找出不是一大块#的最小行、最大行、最小列、最大列
    for(int i=0; i<4; i++)
        dfs(x+bx[i],y+by[i]);//当前位置上下左右移动
    }
    return ;
}
int main()
{
cin>>n>>m;//读入行数、列数
for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
        cin>>a[i][j];//读入数据
for(int i=1; i<=n; i++)
{
    for(int j=1; j<=m; j++)
    {
        if(a[i][j]=='#')//如果这个位置有“#”,搜索去,不然去搜索没有什么价值
        {
            xx=-1,dd=-1,xb=2100000,db=2100000;//位置需要初始化
            dfs(i,j);//搜索去
            for(int k=xb; k<=xx; k++)
            {
                for(int l=db; l<=dd; l++)
                {
                    if(a[k][l]=='.')pd=1,s=-1;//如果出现“.”,说明找到的这一块不是船
                    a[k][l]='.';//把当前位置变为水,因为已经找过这个位置了
                }
            }
            if(pd==0)s++;
        }
    }
}
if(s!=-1)cout<<"There are "<<s<<" ships.";
else cout<<"Bad placement.";
//输出操作
return 0;
}

题解:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstdlib>
#include<algorithm>//文件头不解释
using namespace std;
int m,n,f[1005][1005],s,b[1005][1005],pd,lll;
int xx,dd,xb,db;
char a[1005][1005];//定义一堆变量
int bx[4]={0,0,-1,1};
int by[4]={-1,1,0,0};//控制当前位置上下左右的移动的数组,一个控制行,一个控制列
void dfs(int x,int y)//广度优先搜索
{
    if(x<1||x>n||y<1||y>m||f[x][y]==1||a[x][y]!='#')return ;//如果当前位置超过了边界或者访问过当前位置或者当前位置是水则返回上一次
    else//否则
    {
    a[x][y]='@';//当前位置设为@这个符号,也就是标记当前位置
    f[x][y]=1;//标记当前位置(是不是和上一个重复了?我不管)
    if(x>xx)xx=x;
    if(y>dd)dd=y;
    if(x<xb)xb=x;
    if(y<db)db=y;
    //这里是本程序的重点部分,找出不是一大块#的最小行、最大行、最小列、最大列
    for(int i=0; i<4; i++)
        dfs(x+bx[i],y+by[i]);//当前位置上下左右移动
    }
    return ;
}
int main()
{
cin>>n>>m;//读入行数、列数
for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
        cin>>a[i][j];//读入数据
for(int i=1; i<=n; i++)
{
    for(int j=1; j<=m; j++)
    {
        if(a[i][j]=='#')//如果这个位置有“#”,搜索去,不然去搜索没有什么价值
        {
            xx=-1,dd=-1,xb=2100000,db=2100000;//位置需要初始化
            dfs(i,j);//搜索去
            for(int k=xb; k<=xx; k++)
            {
                for(int l=db; l<=dd; l++)
                {
                    if(a[k][l]=='.')pd=1,s=-1;//如果出现“.”,说明找到的这一块不是船
                    a[k][l]='.';//把当前位置变为水,因为已经找过这个位置了
                }
            }
            if(pd==0)s++;
        }
    }
}
if(s!=-1)cout<<"There are "<<s<<" ships.";
else cout<<"Bad placement.";
//输出操作
return 0;
}

这毫无区别吧

@chen_zhe @ 一扶苏一

2024/1/2 18:56
加载中...