atwdlxz6 2022-01-20 21:12 采纳率: 100%
浏览 34
已结题

无法输入二维数组,直接程序自动结束,如何解决?

背景:做题遇到,题目
农夫约翰的农场可以表示成N*M(1≤N≤100≤M≤100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。每一个方格或者有积水('W')或者没有积水('.')。农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格,每一个方格周围的八个方格都被认为是与这个方格相连的。现给出约翰农场的图样,要求输出农场上的池塘数。
输入
第1行:由空格隔开的两个整数:N和M
第2..N+1行:每行M个字符代表约翰农场的一排方格的状态。每个字符或者是'W'或者是'.',字符之间没有空格。
输出
输出只有1行,输出约翰农场上的池塘数

代码

#include <bits/stdc++.h>
using namespace std;
int n,m,b[101][101]={},out=0,a[101][101]={};
char linshi;
void lookfor(int numi,int numj){
    if(a[numi][numj]==1&&b[numi][numj]==0){
        b[numi][numj]=1;
        lookfor(numi,numj+1);
        lookfor(numi+1,numj);
        lookfor(numi+1,numj+1);
    }
}
int main(){
    cin>>n,m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>linshi;
            if(linshi=='W'){
                a[i][j]=1;
            }
        }
    }
    for(int i=1;i<n;i++){
        for(int j=1;j<m;j++){
            if(b[i][j]==0){
                lookfor(i,j);
                out++;
            }
        }
    }
    return 0;
}

运行结果:没有办法下文的

之前是直接char二维数组的,后来出现问题变成char转成0 1两种,放到int二维数组里,结果没用
我的思路有问题?

我想要达到的结果

输入
10 12
(字符串,加上我发不出去)
输出
3

谢谢

  • 写回答

3条回答 默认 最新

  • _GX_ 2022-01-20 22:05
    关注
    #include <bits/stdc++.h>
    
    using namespace std;
    
    void visit(vector<string> &a, int n, int m, int i, int j, char flag)
    {
        vector<pair<int, int>> coords;
        a[i][j] = flag;
        for (int u = -1; u <= 1; u++)
        {
            for (int v = -1; v <= 1; v++)
            {
                int x = i + u;
                int y = j + v;
                if ((x < 0 || x >= n) || (y < 0 || y >= m) || (x == i && y == j))
                    continue;
                if (a[x][y] == 'W')
                {
                    a[x][y] = flag;
                    coords.push_back({x, y});
                }
            }
        }
        for (auto [x, y] : coords)
            visit(a, n, m, x, y, flag);
    }
    
    int main()
    {
        int n, m;
        cin >> n >> m;
        vector<string> a(n);
        for (int i = 0; i < n; i++)
            std::cin >> a[i];
        int count = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (a[i][j] == 'W')
                {
                    count++;
                    visit(a, n, m, i, j, '0' + count);
                }
            }
        }
        printf("%d\n", count);
        return 0;
    }
    
    $ g++ -Wall -std=c++17 main.cpp
    $ cat test.txt
    10 12
    ......W.....
    .W....WW....
    .WW.........
    ..WW........
    ..W........
    ............
    ........WW..
    ........WWW.
    ...........W
    ...........W
    $ cat test.txt | ./a.out
    3
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月29日
  • 已采纳回答 1月21日
  • 创建了问题 1月20日

悬赏问题

  • ¥15 ios 新安装app收不到fcm推送
  • ¥15 有没有实力的写手?有过成品的优先
  • ¥15 图像信息库的建立与识别
  • ¥15 韩国网站购物,KG支付的支付回调如何解决
  • ¥15 workstation导入ovf文件,报错,怎么解决呢?
  • ¥15 关于#c语言#的问题:构成555单稳态触发器,采用LED指示灯延时时间,对延时时间进行测量并显示(如楼道声控延时灯)需要Proteus仿真图和C语言代码
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,怎样解决呢?
  • ¥50 如何用单纯形法寻优不能精准找不到给定的参数,并联机构误差识别,给定误差有7个?matlab
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,没有XFS,怎样解决呢?
  • ¥15 应用商店如何检测在架应用内容是否违规?