想知道个简单点的方法
题目是这样的,2维数组a{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}
要求2维数组b中存放的数为对应的a的相邻元素中按从小到大排序中的中间值;
如:b[0][0] 的值为 a[0][0]的相邻元素{2,6,7}中的中间值6,中间值的取法为元素个数k/2
b[1][1] 的值为 a[1][1]的相邻元素{1,2,3,6,8,11,12,13}的中间值8;
要求编程求出数组b(a数组可变)?
下面是我编的,感觉太烦了,想要知道怎么编个简单点的。
[code=C/C++][/code]
#include<stdio.h>
int cr(int s[],int *top,int x)
{
int n,i,j;
n = *top;
if(n > 10)
{
printf("error\n");
return (1);
}
for(i=0;i<n;i++)
if(s[i] > x)
{
for(j=n;j>i;j--)
s[j] = s[j-1];
s[j] = x;
*top = ++n;
return (1);
}
s[n] = x;
*top = ++n;
return(1);
}
int main(void)
{
int a[5][5]={{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}};
int b[5][5],c[10]= {0};
int i,j,k=0,i1,j1,i2,j2,l;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
for(i2=0,i1 = i-1; i2<3; i2++,i1++)
for(j2=0,j1=j-1;j2<3;j2++,j1++)
{
if((i1>=0) && (i1<5) && (j1>=0) && (j1<5) )
if( !( (i1 == i) && (j1 == j) ) )
cr(c,&k,a[i1][j1]);
}
k = k/2;
b[i][j] = c[k];
for(l=0;l<10;l++)
c[l] = 0;
k = 0;
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return (1);
}
[解决办法]
#include <stdio.h>int value(int s[][5],int x,int y){ int i,j=0,k,b; int r[9]; for(i=0;i<9;i++) if((i/3-1+x)>=0 && (i/3-1+x<5) && (i%3-1+y>=0) &&(i%3-1+y<5) && i!=4) //取相邻数据形成数组 r[j++]=s[i/3-1+x][i%3-1+y]; for(i=0;i<j;i++) //排序 for(k=i;k<j;k++) if(r[i]>r[k]) { b=r[i]; r[i]=r[k]; r[k]=b; } return r[j/2]; //结果}main(){ int a[5][5]={{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25}}; int b[5][5]; int i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) b[i][j]=value(a,i,j); for(i=0;i<5;i++) { for(j=0;j<5;j++) printf("%2d ",b[i][j]); printf("\n"); } system("pause");}