用C语言实现,输入一个18*4的二维数组,对整行进行全排列,并计算每个数组的各列不为零元素下标

计算四个下标和的总和,求此时总和最小时候的数组。各列不为零元素下标之和计算出来之后又成为一行,这样就组成了一个19*4的数组,输出最终这样的数组。
每列的下标是只计算不为零元素的下标之和,为零的不计入。多谢各位大神了,很急很急!

第1个回答  2015-01-12

#include <stdio.h>

#define NUM_COLUMN 4
#define NUM_ROW    18
#define NUM_TOTAL  NUM_ROW+1

int _nums[19][4]={
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4}
};

void printArray()
{
for( int r = 0;r<NUM_TOTAL;++r )
{
printf("{");

for( int c=0;c<NUM_COLUMN;++c)
{
if( c != NUM_COLUMN-1 )
{
printf("%d,",_nums[r][c]);
}
else
{
printf("%d",_nums[r][c]);
}
}
printf("}\n");
}
}

void columnSum()
{
int *sum= NULL;

for( int column = 0;column<NUM_COLUMN;++column )
{
sum=&_nums[NUM_ROW][column];

for( int r = 0;r<NUM_ROW;++r )
{
if( _nums[r][column] != 0 )
*sum += r ;
}
}
}

int main( int argc, char* argv[] )
{
printArray();

columnSum();

printArray();
return 0;
}

小代码一段,仅供参考。

本回答被网友采纳
第2个回答  2015-01-12
请问求和时候的下标是不是横纵坐标都包括?追问

不是,只是计算它是第几行就可以,只是纵坐标

追答

我程序马上写完了,有测试数据么?

如果我的理解没问题的话,那么这道题,其实就是就是让,统计每行的0的个数,然后把0个数比较少的行放在前面,最多的行放在最后。(这样可以保证为0的那些数的纵坐标之和最小)

#include<stdio.h>
#define COLS 4
#define ROWS 19
int get_cost(int *a, int n){ //计算每行0的个数
int i,count = 0;
for(i = 0; i<n; i++){
if(a[i] == 0){
count++;
}
}
return 0;
}
int swap_array(int *a, int *b, int n){
int tmp, i;
for(i = 0; i<n; i++){
tmp = a[i];
a[i] = b[i];
b[i] = tmp;
}
}
void bubblesort_array(int (*list)[COLS],int len) //冒泡排序
{
    int i,j;
int temp;
    for(i=0;i<len - 1;i++)
        for(j=0;j<len-i - 1;j++) 
        {
            if(get_cost(list[j+1],COLS)<get_cost(list[j],COLS))
            {
swap_array(list[j], list[j+1], COLS);
            }
        }
}
int main(){
int tar[ROWS][COLS] = {0};
int i,j;
//输入
for(i =0; i<ROWS -1; i++){
for(j = 0; j<COLS; j++){
scanf("%d", &tar[i][j]);
}
}
//排序
bubblesort_array(tar, ROWS-1);
//统计最后一行的和
for(i = 0; i<ROWS-1; j++){
for(j = 0; j<COLS; j++){
if(tar[i][j] == 0){
tar[ROWS-1][j]+=i;
}
}
}
for(i = 0; i<ROWS; i++){
for(j =0; j<COLS; j++){
printf("%d ", tar[i][j]); 
}
printf("\n");
}
return 0;
}

追问

有的。
0 -19 5 9
0 0 -20 -4
0 -40 57 6
0 0 -1 -6
0 0 -6 0.5
0 -20 25 0
0 0 -81 -6
数据太多提交不上去,还麻烦您回一下,我把下面的数据在输进去

追答

好的

追问

0 -33 16 11;0 -14 17 5 ;0 -1 -10 2.5 ;-16 1 -11 -11 ;16 195 66 -7 ;0 -11 -1.5 0 ;0 -58 -6.5 0 ;0 0 -10 0 ;0 0 -14 0;0 0 -14 0 ;0 0 -11 0

追答//之前的code有几个低级错误,已经修改过来了
#include<stdio.h>
#define COLS 4
#define ROWS 19
int get_cost(float *a, int n){ 
int i,count = 0;
for(i = 0; i<n; i++){
if(a[i] == 0.0){count++;}
}
return count;
}
void swap_array(float *a, float *b, int n){
float tmp;
int i;
for(i = 0; i<n; i++){
tmp = a[i];a[i] = b[i];b[i] = tmp;
}
}
void bubblesort_array(float (*list)[COLS],int len) 
{
    int i,j;
    for(i=0;i<len - 1;i++)
        for(j=0;j<len-i - 1;j++) 
        {
            if(get_cost(list[j+1],COLS)>get_cost(list[j],COLS))
            {
swap_array(list[j], list[j+1], COLS);
            }
        }
}
int main(){
float tar[ROWS][COLS] = {0};
int i,j,final_sum = 0
for(i =0; i<ROWS -1; i++){
for(j = 0; j<COLS; j++){
scanf("%f", &tar[i][j]);
}
}
bubblesort_array(tar, ROWS-1);
for(i = 0; i<ROWS-1; i++){
for(j = 0; j<COLS; j++){
if(tar[i][j] == 0){
tar[ROWS-1][j]+=i;
}
}
}
for(i = 0; i<ROWS; i++){
for(j =0; j<COLS; j++){
printf("%2.2f ", tar[i][j]); 
}
printf("\n");
}
for(i = 0; i<COLS; i++){
final_sum += tar[ROWS-1][i];
}
printf("%d\n", final_sum);
return 0;
}

追问

这个怎么解决?是不是版本的原因呢?我用的是2008版。我应该怎么改,很着急,谢谢!

追答

你创建的不是C或C++的工程,你创建的是C#的工程吧。看文件的后缀名是.cs?

追问

错误 1 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”? c:\users\yan wu\documents\visual studio 2008\projects\bklyh\bklyh\bklyh.cpp 61 bklyh
恩,是的,我改成C++了,可是出了上个错误,您能再告诉我一下这是什么回事吗?

追答

你创建的项目类型应该不是”win32 空项目“

追问

我手动改成.c了,用了你的后面的代码,添加了源文件,可是还是有错。

追答

字数超了,我私信给你

本回答被提问者采纳