C语言:要这道题的代码,二维数组的。 c语言:(求代码) 描述 给定一个N行N列的整数矩阵(N<

C语言:要这道题的代码,二维数组的。
c语言:(求代码) 描述

给定一个N行N列的整数矩阵(N<=10),可以任意选定两行进行调换(1.只能调换一次;2.调换的两行为同一行相当于不调换) 问,调整后的矩阵,右上三角元素和与左下三角元素和可能的最大差值为多少?

输入格式

第一行为正整数N,此后N行,每行N个整数。

输出格式

任意选定两行进行调换后,可能的最大差值

输入样例

3 1 2 3 4 5 6 7 8 9

输出样例

16

提示

将第1行与第3行交换,8+9+6-4-1-2=16

#include<stdio.h>

#include<stdlib.h>

typedef struct DataType

{

int result;

int row,column;

}Data;

typedef struct ListData

{

Data data;

struct ListData *next;

}List;

void Diaohuan(int **a,int **b,int n,int i,int j)

{

int k,l;

if(i>j)

{

k=i;

i=j;

j=k;

}

for(k=0;k<i;k++)

for(l=0;l<n;l++)

b[k][l]=a[k][l];

for(l=0;l<n;l++)

b[i][l]=a[j][l];

for(k=i+1;k<j;k++)

for(l=0;l<n;l++)

b[k][l]=a[k][l];

for(l=0;l<n;l++)

b[j][l]=a[i][l];

for(k=j+1;k<n;k++)

for(l=0;l<n;l++)

b[k][l]=a[k][l];

}

int Cal(int **a,int n)

{

int i,j;

int up=0,down=0;

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++)

up+=a[i][j];

for(i=1;i<n;i++)

for(j=0;j<i;j++)

down+=a[i][j];

int result=up-down;

if(result<0)

return -result;

return result;

}

List * CreateList(int result,int i,int j)

{

List *h=(List*)malloc(sizeof(List));

h->data.result=result;

h->data.row=i;

h->data.column=j;

h->next=NULL;

return h;

}

void Add(List *h,int result,int i,int j)

{

List *l=(List*)malloc(sizeof(List));

l->data.result=result;

l->data.row=i;

l->data.column=j;

l->next=NULL;

List *l1=h;

while(l1->next)

l1=l1->next;

l1->next=l;

}

Data Find(List *h)

{

List *p=h;

Data d=p->data;

while(p->next)

{

p=p->next;

if(p->data.result>d.result)

d=p->data;

}

return d;

}

void Free(List *h)

{

List *p=h;

while(h->next)

{

h=h->next;

free(p);

p=h;

}

}

int main()

{

int i,j,n;

int **a,**b;

scanf("%d",&n);

a=(int**)malloc(n*sizeof(int*));

b=(int**)malloc(n*sizeof(int*));

for(i=0;i<n;i++)

{

a[i]=(int*)malloc(n*sizeof(int));

b[i]=(int*)malloc(n*sizeof(int));

}

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

List *h=CreateList(Cal(a,n),0,0);

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{

if(i==0&&j==0)

continue;

Diaohuan(a,b,n,i,j);

Add(h,Cal(b,n),i,j);

}

}

Data data=Find(h);

printf("\n\n%d\n\n",data.result);

Diaohuan(a,b,n,data.row,data.column);

printf("提示:\n\n第%d行与第%d行交换。\n\n",data.row+1,data.column+1);

for(i=0;i<n-1;i++)

{

for(j=i+1;j<n;j++)

{

if(i==0&&j==1)

printf("|%d",b[i][j]);

else printf("+%d",b[i][j]);

}

}

for(i=1;i<n;i++)

for(j=0;j<i;j++)

printf("-%d",b[i][j]);

printf("|=%d\n\n",data.result);

free(a);free(b);

Free(h);

return 0;

}

追问

有这么复杂吗...

追答

想到什么就写了什么,也许不要这么复杂,不过要精简的代码需要时间构思。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-12-21
什么时候要?是求出所有调换组合中的最大差值还是随机调换的最大差值?追问

写出来给我就行了...

追答