搜索
查看: 1316|回复: 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;
}



最佳答案

查看完整内容

代码的问题在于最后那个嵌套的5层循环,明显是不正确的 正确做法是拷贝前九个元素(r[] c[]的也一同拷贝),然后按r[] c[]中的位置信息排序 这里用struct比较好写,不然就比较乱了 思路是可以的,但是选择排序用在1024*1024的数据集上是没戏的 试试快速排序吧 还有一个比较容易想到的办法是用二元组存储数据 struct data{ int num; int pos; }num_pos; num存储实际数据,pos记录坐标(也就是1024 * x + y,觉得麻 ...
沙发
发表于 2013-11-8 10:18:32 | 只看该作者
本帖最后由 rosynirvana 于 2013-11-8 14:40 编辑

代码的问题在于最后那个嵌套的5层循环,明显是不正确的
正确做法是拷贝前九个元素(r[] c[]的也一同拷贝),然后按r[] c[]中的位置信息排序
这里用struct比较好写,不然就比较乱了

思路是可以的,但是选择排序用在1024*1024的数据集上是没戏的
试试快速排序吧

还有一个比较容易想到的办法是用二元组存储数据
struct data{
  int num;
  int pos;
}num_pos;
num存储实际数据,pos记录坐标(也就是1024 * x + y,觉得麻烦不怕费内存也可以用三元组把x,y都存储起来)
然后用最大堆,再取9次最大值,得到的就是最大的9个元素和位置

顺便问一下,http://bbs.ahalei.com/thread-3060-1-1.html 这个问题是解决了吗
板凳
 楼主| 发表于 2013-11-15 17:28:57 | 只看该作者
rosynirvana 发表于 2013-11-8 14:32
代码的问题在于最后那个嵌套的5层循环,明显是不正确的
正确做法是拷贝前九个元素(r[] c[]的也一同拷贝) ...

谢谢指点啊。分数待会给你。
有另外一个问题,想请教下你。在另一个帖子里给你回复了。麻烦你看看
地板
发表于 2013-12-8 19:36:24 来自手机 | 只看该作者
头都晕啦我来自: iPhone客户端
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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