用二维数组ppDibBits来表示一张字符图像,0表示空白,1表示黑色,其中共有15个由'1'组成的字符;我对二维数组用投影法来行和列的扫描,但最后显示的结果只有10字符,不知道我写的算法错在哪里,我看不出来诶……
public class CharCount { //20*30的“图像”
private int[][] ppDibBits ={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,1,0,0},
{0,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0},
{0,1,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
{0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0},
{0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,0,0,1,1,1,1,0,0,0,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};


public int countChar(int Dx, int Dy) // 字符统计。Dx图像的宽(即列数),Dy图像的行(即行数)
{
int x1,x2,flag1,flag2,test,count;
x1 = 0;
x2 = 0;
flag1 = 1; // 用于探测行的标记
flag2 = 1; // 用于探测字符的标记
test = 0;
count = 0; // 计数器 for(int i = 0; i < Dy; i++)
{
if(flag1 == 1)
{
for(int j = 0; j < Dx; j++) // 探测行的起始位置,并标记该行在数组中的起始位置为x1
{
if(ppDibBits[i][j] == 1)
{
x1 = i;
flag1 = 2;
break;
}
}
}
else if(flag1 == 2) // 探测行的结束位置,并标记该行在数组中结束位置为x2
{
for(int j = 0; j < Dx; j++)
test = test + ppDibBits[i][j];

if(test == 0)
{
flag1 = 0;
x2 = i;
}
else
test = 0;
}
else if(flag1 == 0)
{
for(int j = 0; j < Dx; j++)
{
if(flag2 == 1) // 探测该行的字符,遇到一个字符计数器count加1
{
for(int m = x1; m < x2 + 1; m++)
{
if(ppDibBits[m][j] == 1)
{
++count;
flag2 = 2;
break;
}
}
}
else if(flag2 == 2)
{
for(int m = x1; m < x2 +1; m++)
test = test + ppDibBits[m][j];
if(test == 0)
flag2 = 1;
else
test = 0;
}
}
flag1 = 1;
}
} return count; //返回总字符数 } public static void main(String[] args) {

CharCount c = new CharCount();

System.out.println( c.countChar(30, 20) );

} }

解决方案 »

  1.   

    你的程序,不知道你要得到的是什么?
    如果你只是单纯的想得到数组里有多少个1,那很简单啊,把数组里所有元素加起来就好了
    public int countChar(int dx,int dy){
      int count=0;
      for(int i=0;i<dy;i++){
        for(int j=0;j<dx;j++){
           count+=ppDibBits[i][j];
        }
      }
      return count;
    }
      

  2.   

    哦,不好意思,理解错题设了,说你的程序,
    首先,我的理解是
    你在按列去找字符,如果找到,就看下一列有没有
    可以是你的大量使用else if导致程序有很多盲点,当找到字符,什么都干不了,就去处理下一列的问题了,如果在同一列牵涉2个字符那么下面的肯定被忽略了
    另外即使你的flag1==0了,还是会出现因为else if导致忽略很多问题的情况
    所以你不要以为你得到的10是真的找到了10个字符,
    事实上你找到的字符比10个更少,而且很畸形,仔细的研究一下你的else if 的使用或许对你有帮助
      

  3.   

    不太明白你的意思
    但是似乎逻辑不对啊
    你break以后就跳出循环了,这个时候程序再跑,i已经变了阿
    你这样取到的还能对吗?
      

  4.   

    int[][] ppDibBits 数组有20*30;
    把它看做一幅图像,里面有15个字符,字符定义为连贯的,由'1'组成;即每个'1'的上下左右还有'1'存在的话那它们都是同属于一个字符的,这样的字符一共有15个;
    我写的算法是:
    a、探测一行字符的开始位置,把该数组行号记录下来,标为x1,跳出循环,进入b步骤;
    b、探测该行字符的结束位置,把该数组行号记录下来,标为x2,进入c步骤;
    c、扫描该行的字符,遇到一个字符,计数器count加1,跳出循环,进入d步骤;
    d、扫描该字符的结束位置,找到结束位置后会继续跳到c步骤,直到统计完该行的字符数,然后又重新跳到a步骤继续探测下一行字符,直到所有字符统计完毕。在ppDibBits数组中总共有15个字符,
    main方法中c.countChar(30, 20)结果只显示为10,即最后一行字符没统计出来;
    当参数改为c.countChar(30, 21)时显示结果为预期的15;问题是我设计的ppDibBits数组是20*30的,改为21时数组怎么没越界??我没看出我写的代码哪里出错了,请大家帮我看看漏洞在哪里……
      

  5.   

    问题已经解决,因为在for循环中有if else if
    所以当探测到最后一行的时候循环已经结束,来不及探测最后一行的字符,所以在方法体内应该先将行数Dy加1即可