c语言-C语言相邻数求最大和的问题求解答

问题描述

C语言相邻数求最大和的问题求解答

#include
int** matrix(int row) {
int** matr;
matr = malloc(row*sizeof(int*));
for(int i = 0; i < row; i++) {
matr[i] = malloc(row*sizeof(int));
}
return matr;

}

void get_input(int** arrays, int row) {
for(int i = 0; i < row; i++) {
for(int j = 0; j < row; j++) {
scanf("%d", &arrays[i][j]);
}
}

}

int compareFunction(const void *a,const void *b) {

return *(int *)b - *(int *)a;

}

int compareBigger(int *diagline, int maxium) {
if(diagline[0] >= maxium) {
maxium = diagline[0];
}
return maxium;
}

void rowdirection(int *straightline, int num, int rows, int **mat) {
int i = 0;
for(int row = 0; row < rows; row++) {
for(int column = 0; column < rows - num + 1; column++ ) {
for(int j = 0; j < num; j++) {
straightline[i] += mat[row][column + j];
}i++;
}
}
}

void coldirection(int *straightline, int num, int rows, int **mat) {
int i = 0;
for(int column = 0; column < rows; column++) {
for(int row = 0; row < rows - num + 1; row++ ) {
for(int j = 0; j < num; j++) {
straightline[i] += mat[row + j][column];
}i++;
}
}
}

void diagdirection(int *diagline, int num, int rows, int **mat) {

int i = 0;
for(int row = 0; row < rows - num + 1; row++ ) {
    for(int col = 0; col < rows - num + 1; col++ ) {
        for(int j = 0; j < num; j++) {
            diagline[i] += mat[row + j][col + j];
        }i++;
        //printf("%dn", diagline[i]);
    }
}

}

void antidiagdirection(int *diagline, int num, int rows, int **mat) {

int i = 0;
for(int row = 0; row < rows - num + 1; row++ ) {
    for(int col = num - 1; col < rows; col++ ) {
        for(int j = 0; j < num; j++) {
            diagline[i] += mat[row + j][col - j];
        }i++;
        //printf("%dn", diagline[i]);
    }
}

}

void main() {

int maxium = 0;

int row, num;
scanf("%d %dn", &row, &num);
int straightnum = row*(row - num + 1);
int diagnum = (row - num + 1)*(row - num + 1);
int **mat = matrix(row);

get_input(mat, row);

int *straightline1 = (int *)malloc(straightnum*sizeof(int));
rowdirection(straightline1, num, row, mat);
qsort(straightline1, straightnum, sizeof(int), compareFunction);
maxium = compareBigger(straightline1, maxium);
//printf("%dn", maxium);

int *straightline2 = (int *)malloc(straightnum*sizeof(int));
coldirection(straightline2, num, row, mat);
qsort(straightline2, straightnum, sizeof(int), compareFunction);
maxium = compareBigger(straightline2, maxium);
//printf("%dn", maxium);

int *diagline1 = (int *)malloc(diagnum*sizeof(int));

    diagdirection(diagline1, num, row, mat);
    qsort(diagline1, diagnum , sizeof(int), compareFunction);
    maxium = compareBigger(diagline1, maxium);

//printf("%dn", maxium); 

int *diagline2 = (int *)malloc(diagnum*sizeof(int));

    antidiagdirection(diagline2, num, row, mat);
    qsort(diagline2, diagnum , sizeof(int), compareFunction);
    maxium = compareBigger(diagline2, maxium);

//printf("%dn", maxium);

    printf("%d", maxium);

free(straightline1);
free(straightline2);
free(diagline1);
free(diagline2);
free(mat);

}


学校的作业,input是第一行 两个int, 一个是 下面的表的行列数(方阵),一个是用来规定有多少个相邻数来求最大和。
我用的是四种function把所有情况都写进四个指针,初始化maxium=0,然后指针内部降序排序,四次依次询问是否大于maxium,最后输出maxium。
问题是有些未知的test(test文件老师不会公开给我们)是wrong answer,菜鸟如我找不出那个情况。
题目有行数不超过100,求和个数不超过行数,每个数字不大于1000的限制,
然后test的工具可以忽略free的问题(我还没来得及写,但是free不会造成wrong answer)
求大神指点
代码楼下附加

解决方案

#include
int** matrix(int row) {
int** matr;
matr = malloc(row*sizeof(int*));
for(int i = 0; i < row; i++) {
matr[i] = malloc(row*sizeof(int));
}
return matr;

}

void get_input(int** arrays, int row) {
for(int i = 0; i < row; i++) {
for(int j = 0; j < row; j++) {
scanf("%d", &arrays[i][j]);
}
}

}

int compareFunction(const void *a,const void *b) {

return *(int *)b - *(int *)a;

}

int compareBigger(int *diagline, int maxium) {
if(diagline[0] >= maxium) {
maxium = diagline[0];
}
return maxium;
}

void rowdirection(int *straightline, int num, int rows, int **mat) {
int i = 0;
for(int row = 0; row < rows; row++) {
for(int column = 0; column < rows - num + 1; column++ ) {
for(int j = 0; j < num; j++) {
straightline[i] += mat[row][column + j];
}i++;
}
}
}

void coldirection(int *straightline, int num, int rows, int **mat) {
int i = 0;
for(int column = 0; column < rows; column++) {
for(int row = 0; row < rows - num + 1; row++ ) {
for(int j = 0; j < num; j++) {
straightline[i] += mat[row + j][column];
}i++;
}
}
}

void diagdirection(int *diagline, int num, int rows, int **mat) {

int i = 0;
for(int row = 0; row < rows - num + 1; row++ ) {
    for(int col = 0; col < rows - num + 1; col++ ) {
        for(int j = 0; j < num; j++) {
            diagline[i] += mat[row + j][col + j];
        }i++;
        //printf("%dn", diagline[i]);
    }
}

}

void antidiagdirection(int *diagline, int num, int rows, int **mat) {

int i = 0;
for(int row = 0; row < rows - num + 1; row++ ) {
    for(int col = num - 1; col < rows; col++ ) {
        for(int j = 0; j < num; j++) {
            diagline[i] += mat[row + j][col - j];
        }i++;
        //printf("%dn", diagline[i]);
    }
}

}

void main() {

int maxium = 0;

int row, num;
scanf("%d %dn", &row, &num);
int straightnum = row*(row - num + 1);
int diagnum = (row - num + 1)*(row - num + 1);
int **mat = matrix(row);

get_input(mat, row);

int *straightline1 = (int *)malloc(straightnum*sizeof(int));
rowdirection(straightline1, num, row, mat);
qsort(straightline1, straightnum, sizeof(int), compareFunction);
maxium = compareBigger(straightline1, maxium);
//printf("%dn", maxium);

int *straightline2 = (int *)malloc(straightnum*sizeof(int));
coldirection(straightline2, num, row, mat);
qsort(straightline2, straightnum, sizeof(int), compareFunction);
maxium = compareBigger(straightline2, maxium);
//printf("%dn", maxium);

int *diagline1 = (int *)malloc(diagnum*sizeof(int));

    diagdirection(diagline1, num, row, mat);
    qsort(diagline1, diagnum , sizeof(int), compareFunction);
    maxium = compareBigger(diagline1, maxium);

//printf("%dn", maxium); 

int *diagline2 = (int *)malloc(diagnum*sizeof(int));

    antidiagdirection(diagline2, num, row, mat);
    qsort(diagline2, diagnum , sizeof(int), compareFunction);
    maxium = compareBigger(diagline2, maxium);

//printf("%dn", maxium);

    printf("%d", maxium);

free(straightline1);
free(straightline2);
free(diagline1);
free(diagline2);
free(mat);

}


时间: 2024-09-21 09:00:01

c语言-C语言相邻数求最大和的问题求解答的相关文章

c语言-C语言 给定一个整数序列和一个数k,求这个序列中第k小的数。

问题描述 C语言 给定一个整数序列和一个数k,求这个序列中第k小的数. C语言 给定一个整数序列和一个数k,求这个序列中第k小的数. 我的程序 #include<stdio.h> int n[10000]; void Nok() { int i=0,j=0,t,k,q=0; char c; scanf("%d",&n[i++]); c=getchar(); while(c!='n') { scanf("%d",&n[i++]); c=ge

c语言-C语言自己写的程序有个小错,求改下

问题描述 C语言自己写的程序有个小错,求改下 #includeint main(){ int nlkyt1t2t3;char x1x2x3;t1=0;t2=0;t3=0; printf(""请输入现在队伍的列数:n""); scanf(""%d""&n); printf(""拉面的制作时间:n""); scanf(""%d""&l)

c语言-关于数据结构的简单问题完整算法 C语言 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号

问题描述 关于数据结构的简单问题完整算法 C语言 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号 急急急紧急急急急急急急急急急急急急急急急急急急急急急 解决方案 先是存储结构后是伪代码,你想要算法就看注释吧~ Typedef struct Node { Char vex; //顶点 Int degree; //度数 }Node; Node ArrDegree[m]; //m+1为顶点个数 For(i =0; i ArrDeg

磁盘-新手学习C语言文件,问题已经在程序中备注,求解答!

问题描述 新手学习C语言文件,问题已经在程序中备注,求解答! //怎样向文件读写字符 #include #include int main() { FILE * fp; char ch,filename[10]: printf("请输入所用的文件名:"); scanf("%s",filename); if((fp = fopen(filename,"w")) == NULL)//为什么这里的filename没有双引号引起来: { printf(&

c-C语言输出数字团,代码为什么出现Segmentation fault,求解释并纠错??

问题描述 C语言输出数字团,代码为什么出现Segmentation fault,求解释并纠错?? //题目:输出字符串里数字团,以及个数.比如89cy129 //就输出89,129,一共2个数. 代码在这个百度知道的问题上:well,看来百度知道上面没有人会做? 跪谢!!! 源代码: include int main() { int a[80],i=0,*pa,an=0; char str[80],*pstr=str; void getnum(char pstr); gets(str); get

c语言-用C语言实现一个猜数游戏,用递归实现

问题描述 用C语言实现一个猜数游戏,用递归实现 用C语言实现一个猜数游戏,随机产生一个数,用户每次猜,告诉它大了或者小了,知道猜对,用递归实现 解决方案 #include <stdio.h> #include <stdlib.h> void guess(int num) { int n; printf("请输入整数:"); scanf("%d",&n); if(n>num) printf("大了n"); el

c语言-C语言用函数求最大公约数和最小公倍数,看不出错在哪,代码如下

问题描述 C语言用函数求最大公约数和最小公倍数,看不出错在哪,代码如下 #include int maxnumber(int x,int y) { int a=0; a=x%y; while(a!=0) { a=x%y; x=y; y=a; } return y; } int minnumber(int x,int y) { int z; z=(x*y)/maxnumber(x,y); return z; } void main() { int maxnumber(int x,int y); i

c语言-C语言实现普兰特准数计算的算法请问怎么实现?普兰特准数的基数判定是什么?

问题描述 C语言实现普兰特准数计算的算法请问怎么实现?普兰特准数的基数判定是什么? C语言实现普兰特准数计算的算法请问怎么实现?普兰特准数的基数判定是什么? 解决方案 http://jpkc.jzu.cn/hgyl/dzja/ja1.4/jiaoan1.4.3.htm

java语言如何打印这个图形?有半段代码求指点……

问题描述 java语言如何打印这个图形?有半段代码求指点-- ###* ##** #*** ##** ###* 打印它的三行的代码我已经写出来了 for (int i = 1; i <= 3; i++) { for (int kong =1; kong<=4-i; kong++) { System.out.print(" "); } for (int xing = 1; xing <=i; xing++) { System.out.print("*"