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;
}
追问有这么复杂吗...
追答想到什么就写了什么,也许不要这么复杂,不过要精简的代码需要时间构思。
写出来给我就行了...
追答