c - 计算C中2D字符数组中字符出现的次数

标签 c

#include<stdio.h>
#include <stdlib.h>

int main()  
{

char a[100][100],ch;

 int b[100][100],i,j,k,n,x,y,count,l,m;  
  count=0;

scanf("%d",&n);/*Number of lines of input to be read*/

for(i=0;i<n;i++)/*To read the input*/
{
   scanf("%s",a[i]);
}

for(i=0;i<n;i++) /*To separate the blast radius from char array a*/
 for(j=0;j<n;j++)
{
    if(a[i][j]!='P'&&a[i][j]!='p'&&a[i][j]!='*')
    b[i][j]=a[i][j]-'0';
    else
    b[i][j]=0;
}

 for(i=0;i<n;i++)
 for(j=0;j<n;j++)
 {

 if(b[i][j]!=0)  
   {
      k=b[i][j];
     for(x=i-k;x<=i+k;x++)
     for(y=j-k;y<=j+k;y++)
     a[x][y]='X';

     }
}
  for(i=0;i<n;i++)
   for(j=0;j<n;j++) 
 {
    a[i][j]=ch;
    if(ch=='p')
    count++;
       }

 printf("%d",count);

 }


输入如下
6
p *
**** p *
* p * 1 **
***** p
*** p * p
*** pp2

爆炸后,网格变为(X是爆炸区域)
p *
** XXX *
pX1X
** XXXX
*** XXX
*** XX2

我在查找最终数组中p的出现次数时遇到麻烦。请帮忙

最佳答案

您的代码中有两个不同的问题。

第一:

k=b[i][j];
for(x=i-k;x<=i+k;x++)
  for(y=j-k;y<=j+k;y++)
    a[x][y]='X';


在这里,您需要进行边界检查,以确保您不写数组之外。例如,如果炸弹位于(0,0)上,则i-k为负。
边界检查:

for(x=i-k;x<=i+k;x++)
  for(y=j-k;y<=j+k;y++)
    if(x>=0 && x<n && y>=0 && y<n)
      a[x][y]='X';


第二个问题:

for(i=0;i<n;i++)
 for(j=0;j<n;j++) 
 {
   a[i][j]=ch;
   if(ch=='p')
     count++;
 }


在这里,您将a的每个元素都设置为未初始化的ch。我认为您想直接将a的元素与'p'进行比较。

for(i=0;i<n;i++)
 for(j=0;j<n;j++) 
 {
   if(a[i][j]=='p' || a[i][j]=='P')
     count++;
 }

关于c - 计算C中2D字符数组中字符出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51250240/

相关文章:

c++ - 编译和代码优化

c - 无法理解以下宏

c - 如何在运行时为枚举成员赋值?

c - 想要获取CPU时间,得到了

c++ - 使用 strcat 将字符附加到 C 中的字符串

c - 如何用C语言解决这个问题?

c - 为什么我的程序在 waitpid() 中停止而没有任何错误信息?

c - NTL库中的LLL算法

c - Visual Studio Community 2015 和 C 语言调试

将 Keras 模型转换为 C