51Testing软件测试论坛

标题: 一道矩阵统计的编程题 [打印本页]

作者: ericazou    时间: 2007-9-8 21:06
标题: 一道矩阵统计的编程题
有一个二维字符型矩阵,其中已经有两种数据:‘0’和‘F’。
要求,将字符‘0’替换成周围8个‘F'的个数,并输出替换前后对比。
如:原始矩阵         替换后矩阵
0 0 f 0 f              0 1 f 4 f
0 0 0 f f              1 2 2 f f
f 0 0 0 0            f 1 1 2 2
(暂定为5列)
我自己写了一个函数,比较繁琐,应该有更简洁的办法。
请大家帮我想想。

在VC6.0中编译通过。
void statmap(char Arr[][5],int row,int col)
{
        int i,j;
        int count;
        for (i=0;i<row;i++)
                for (j=0;j<col;j++)
               
                {
                        if ('f'!=Arr[j])        //判断字符是否为零
                        {
                                count=0;
                                if((0<i&&i<row-1) &&(0<j&&j<col-1))//判断不在特殊位置
                                {
                                        if('f'==Arr[i-1][j-1])        count++;                                       
                                        if('f'==Arr[i-1][j])        count++;
                                        if('f'==Arr[i-1][j+1])        count++;
                                        if('f'==Arr[j-1])        count++;

                                        if('f'==Arr[j+1])        count++;
                                        if('f'==Arr[i+1][j-1])        count++;
                                        if('f'==Arr[i+1][j])        count++;
                                        if('f'==Arr[i+1][j+1])        count++;
                                }
                                //判断在特殊位置
                                else if (i==0)//判断在第一行
                                {
                                        if (0<j&&j<col-1)//判断不是在两头
                                        {
                                                if('f'==Arr[j-1])        count++;
                                                if('f'==Arr[j+1])        count++;
                                                if('f'==Arr[i+1][j-1])        count++;
                                                if('f'==Arr[i+1][j])        count++;
                                                if('f'==Arr[i+1][j+1])        count++;
                                        }
                                        else
                                        {       
                                                if(j==0)//判断是在点(0,0)
                                                {
                                                        if('f'==Arr[j+1])        count++;                                                       
                                                        if('f'==Arr[i+1][j])        count++;
                                                        if('f'==Arr[i+1][j+1])        count++;
                                                }
                                                else// 点(0,col-1)
                                                {
                                                        if('f'==Arr[j-1])        count++;                                                       
                                                        if('f'==Arr[i+1][j-1])        count++;
                                                        if('f'==Arr[i+1][j])        count++;
                                                       
                                                }
                                        }
                                }
                                else if (i==row-1)//判断在最后一行
                                {
                                        if (0<j&&j<col-1)
                                        {
                                                if('f'==Arr[i-1][j-1])        count++;
                                                if('f'==Arr[i-1][j])        count++;
                                                if('f'==Arr[i-1][j+1])        count++;
                                                if('f'==Arr[j-1])        count++;
                                                if('f'==Arr[j+1])        count++;       
                                        }
                                        else
                                        {
                                                if(j==0) //点(row-1,0)
                                                {       
                                                        if('f'==Arr[i-1][j])        count++;
                                                        if('f'==Arr[i-1][j+1])        count++;                                                       
                                                        if('f'==Arr[j+1])        count++;
                                                }
                                                else//点(row-1,col-1)
                                                {
                                                        if('f'==Arr[i-1][j-1])        count++;                                                       
                                                        if('f'==Arr[i-1][j+1])        count++;
                                                        if('f'==Arr[j-1])        count++;                                                               
                                                }
                                        }
                                }
                                else if (j==0&&0<i&&i<row-1)//判断在第一列的中间部分
                                {
                                                if('f'==Arr[i-1][j])        count++;
                                                if('f'==Arr[i-1][j+1])        count++;
                                                if('f'==Arr[j+1])        count++;
                                                if('f'==Arr[i+1][j])        count++;
                                                if('f'==Arr[i+1][j+1])        count++;
                                }
                                else if (j==col-1&&0<i&&i<row-1)
                                {
                                                if('f'==Arr[i-1][j-1])        count++;
                                                if('f'==Arr[i-1][j])        count++;
                                                if('f'==Arr[j-1])        count++;
                                                if('f'==Arr[i+1][j-1])        count++;
                                                if('f'==Arr[i+1][j])        count++;
                                }
                               
                                Arr[j]=count+'0';
                        }
                       
                       
                }
}
作者: Jor    时间: 2007-9-8 22:42
扫雷? 不错哈 ````````
作者: ericazou    时间: 2007-9-12 10:10
竟然没有人去优化我的算法
作者: puchonghui    时间: 2007-9-12 12:02
我觉得是不是可以倒过来遍历
判定一个元素是不是f
是f的话周围非f元素+1
另外遍历的时候外边一圈是不是可以考虑分开来写
里面的循环从第二行第二列开始

唔。。不知道这样能不能稍微简化些。。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2