求助,第一个样例输出的东西和实际输出的一样,就是不让过
  • 板块P1331 海战
  • 楼主gm1122
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/27 17:34
  • 上次更新2024/4/27 17:38:14
查看原帖
求助,第一个样例输出的东西和实际输出的一样,就是不让过
646748
gm1122楼主2024/4/27 17:34
#include <bits/stdc++.h>
using namespace std;
char arr[1100][1100];
int pd[1100][1100];
int ans[1000];
int a,b,num = 1;
int fx[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};
void dfs(int zx,int zy,int jishu){
    for(int i = 0; i < 4; i++){
        int nx = zx + fx[i][0];
        int ny = zy + fx[i][1];
        if(nx >= 0 && nx < a && ny >= 0 && ny < b && pd[nx][ny] == 0 && arr[nx][ny] == '#'){
            pd[nx][ny] = jishu;
            dfs(nx,ny,jishu);
        }
    }
}
int zsx,zsy,ysx,ysy,zxx,zxy,yxx,yxy;

void fzs(int nn){
    for(int i = 0; i < a; i++){
        for(int j = 0; j < b; j++){
            if(pd[i][j] == nn){
                zsx = i;
                zsy = j;
                return ;
            }
        }
    }
}

void fys(int nn){
    for(int i = 0; i < a; i++){
        for(int j = b-1; j >= 0; j--){
            if(pd[i][j] == nn){
               ysx = i;
               ysy = j;
               return ;
            }
        }
    }
}

void fzx(int nn){
    for(int i = a-1; i >= 0; i--){
        for(int j = 0; j < b; j++){
            if(pd[i][j] == nn){
                zxx = i;
                zxy = j;
                return ;
            }
        }
    }
}

void fyx(int nn){
    for(int i = a-1; i >= 0; i--){
        for(int j = b-1; j >= 0; j--){
            if(pd[i][j] == nn){
                yxx = i;
                yxy = j;
                return ;
            }
        }
    }
}

bool stapd(int nn){
    ///去找4个方位
    fzs(nn);
    fys(nn);
    fzx(nn);
    fyx(nn);
    ///四个点位是相互平行
    if(zsx == ysx && zsy == zxy && yxy == ysy && zxx == yxx){
        for(int i = zsx; i <= zxx; i++){
            for(int j = zsy; j <= yxy; j++){
                if(arr[i][j] != '#'){
                    return 0;
                }
            }
        }
        return 1;
    }
}

int main(){
    cin >> a >> b;
    for(int i = 0; i < a; i++){
        for(int j = 0; j < b; j++){
            cin >> arr[i][j];
        }
    }
    for(int i = 0; i < a; i++){
        for(int j = 0; j < b; j++){
            if(pd[i][j] == 0 && arr[i][j] == '#'){
                pd[i][j] = num;
                dfs(i,j,num);
                num++;
            }
        }
    }
    ///开始统计
    for(int i = 0; i < a; i++){
        for(int j = 0; j < b; j++){
            if(pd[i][j] != 0){
                ans[pd[i][j]]++;
            }
        }
    }
    for(int i = 1; i < num; i++){
        if(ans[i] == 1){
            continue;
        }
        if(!stapd(i)){
            printf("Bad placement.");
            return 0;
        }
    }

    printf("There are %d ships.",num-1);
    return 0;
}

题目要求没什么看懂,题目中就只说了方形才符合要求,没说几乘几的方形,所以判断方形那里弄得比较麻烦,略过略过

2024/4/27 17:34
加载中...