搜索
查看: 1326|回复: 3
打印 上一主题 下一主题

小弟这里有个程序代码,各位高手进来看看,先谢谢啦!

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-8 10:18:31 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
10啊哈币
/*说明:我这里有一个5*5的数组(实际数组为1024*1024,这里只是为了验证算法的可行性),现在想从中找出9个最大的数值并存入3*3的数组中,并且要记录这9个数值在原来5*5数组中的位置,行列值存入r[],c[],同时保持这些行列值在原始5*5数组中前后相对位置不变(不知道说清楚了么),小弟编了一个程序,但是运行起来一直有问题,的确没辙了,想请教下大家!
还请指教下!
算法思路如下:先由小到大排序,同时记录它们在5*5数组中最原始的位置r[],c[];然后结合这些位置和原始5*5数组,找到最大的9个数值按前后相对位置不变的原则存入bb[][]中。
如果大家有其他的思路,也请指导下!多谢啦!
*/
// paixu_0.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

int main(int argc, char* argv[])
{
int aa[5][5]={ {4,12,54,45,23},
    {6,34,32,54,64},
    {67,34,54,32,43},
    {12,43,56,43,1},
    {5,56,78,98,15}
    };
    int i,j,temp,*p,ia,ib,ja,jb,k,m,n,*q;
    int a[5][5],r[25],c[25],bb[3][3];
        int rc,ra,ca,counts;
//****************************************************//
        //------数组的复制-----//
        for(ia=0;ia<5;ia++)
        {        for(ib=0;ib<5;ib++)
                {a[ia][ib]=aa[ia][ib];
                printf("%3d",a[ia][ib]);
                }
                printf("\n");
        }
        printf("\n");
//**********************************************************//
        //------------数组的排序--------------//
    p = &a[0][0];
        q=&aa[0][0];
        counts=0;ra=0;ca=0;rc=0;
    for(i=0;i<25-1;i++)
    {
        for(j=0;j<25-i-1;j++)
        {       
                        ra=counts/5;
                        ca=counts%5;
                        counts++;

                        if(*(p+j) > *(p+j+1))
            {       
                temp = *(p+j);
                *(p+j)=*(p+j+1);
                *(p+j+1)=temp;
                        //        printf("%3d",a[i][j]);
                                if(j>0)
                                {        *q=*(p+j-1);
                                        if(*(q)!=*(p+j+1))
                                        {
                                        r[rc]=ra;
                                        c[rc]=ca;       
                                        }
                                }
                                else {
                                r[rc]=ra;
                                c[rc]=ca;
                                }
                        }
        }
        //        printf("\n");
                rc++;
    }
//此处是整个程序中最为关键的地方:一方面进行二维数据的排序,从小到大;
//另一方面对每一个排序的数据记录它在5*5二维数组中最原始的位置,并将行列分别存入数组r[]和c[]中!
//*****************************************************************************************************//
        //-------输出排序后的数据----------//
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%3d",a[i][j]);
        }
        printf("\n");
    }
        //--------提取其中3*3的peak并存入bb[]中----------//
        for(ja=0;ja<5;ja++)
                for(jb=0;jb<5;jb++)
                {
                        for(k=0;k<9;k++)
                        {
                                if(ja==r[k]&&jb==c[k])
                                {
                                for(m=0;m<3;m++)
                                        for(n=0;n<3;n++)
                                                bb[m][n]=aa[ja][jb];
                                }
                        }
                }
//结合排序得到的最大的3*3个数据的位置求出相应的3*3矩阵,并存入bb[][]中!
//这是本程序的最终目的:即从5*5矩阵中找出3*3的最大的9个数据,同时记录他们的位置,并存入bb[][]
//(要求这9个数据在aa中的前后位置关系不能更改,即:如果78在aa中前面是56,后面是98,
//那么bb中数据的存储顺序仍然是这样的(56,78,98),不能为(67、78、98)等)
//***********************************************************************************************//
        //--------输出3*3peak数据-------//
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%3d ",bb[i][j]);
        }
        printf("\n");
    }
        return 0;
}



沙发
 楼主| 发表于 2013-11-15 17:28:57 | 显示全部楼层
rosynirvana 发表于 2013-11-8 14:32
代码的问题在于最后那个嵌套的5层循环,明显是不正确的
正确做法是拷贝前九个元素(r[] c[]的也一同拷贝) ...

谢谢指点啊。分数待会给你。
有另外一个问题,想请教下你。在另一个帖子里给你回复了。麻烦你看看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表