跪求C语言编程:随机生成N*N的矩阵,选出n个最小数,要求这些数来自不同行何不同列。各位大神帮帮忙!

作者&投稿:盈钢 (若有异议请与网页底部的电邮联系)
算法题(答对追加100分):n*n矩阵,不同行不同列选n个数 使其和最大 怎么做?~

^A..B..C
D..E..F
G..H..I
∑EFIH = ∑AGIC - ∑ADFC - ∑AGHB + ∑ADEB
先算出以A为左上角的所有矩阵的和(O(N^2))
再枚举所有的子矩阵(O(N^4))
如:
数组按照大小排序,排序的zhi同时记录下行号和列号,如果快速排序,时间复杂度log2(n)*n;
遍历排好顺序的数组,两两求和,同行或同列的就跳过,这个过程要遍历(n-1)+(n-2)+...+3+2次,就算时间复杂度为n2;再对结果遍历一次,取最大值,时间复杂度为n;加起来,忽略非主要项,时间复杂度是n2。

扩展资料:
矩阵在物理学中的另一类泛应用是描述线性耦合调和系统。这类系统的运动方程可以用矩阵的形式来表示,即用一个质量矩阵乘以一个广义速度来给出运动项,用力矩阵乘以位移向量来刻画相互作用。
求系统的解的最优方法是将矩阵的特征向量求出(通过对角化等方式),称为系统的简正模式。这种求解方式在研究分子内部动力学模式时十分重要:系统内部由化学键结合的原子的振动可以表示成简正振动模式的叠加。描述力学振动或电路振荡时,也需要使用简正模式求解。
参考资料来源:百度百科-矩阵

#include "stdio.h"
int main()
{
int d[100][100],n,max[100],min;
int i,j;
printf("输入矩阵阶数:");
scanf("%d",&n);
printf("输入%d*%d阶矩阵:
",n,n);
for(i=0;i<n;i++)
{
scanf("%d",&d[i][0]);
max[i]=d[i][0];
if(i==0) min=d[i][j];
for(j=1;j<n;j++)
{
scanf("%d",&d[i][j]);
if(max[i]<d[i][j])
max[i]=d[i][j];
}
if(min>max[i]) min=max[i];
}
printf("
各行数中最大者中最小的数是%d",min);
}

写了一个简单的,不知道是否符合你的要求。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 矩阵维数
#define N 4
// 存放随机生成的矩阵
int matrix[N][N] = {0};
// 存放所求的来自不同行不同列的最小数
int leastNum[N] = {0};
int main()
{
    int i, j; 
    int n = 4; // 最小数的个数,显然小于等于矩阵的维数N
    int count = 0;
    int min = 0;
    int row = 0; // 记录已经产生过最小数的行标识位
    int column = 0; // 记录已经产生过最小数的列标识位
    int x, y;
    /* 生成并打印随机矩阵 */
    srand((unsigned int)time(NULL));
    for (i=0; i<N; i++)
    {
        for (j=0; j<N; j++)
        {
            matrix[i][j] = rand();
            printf("%12d", matrix[i][j]);
        }
        printf("
");
    }
    printf("
 The least numbers are:
");
    while(count < n)
    {
        /* 遍历求满足条件的最小数,并记录下坐标 */
        min = 0x7fffffff;
        for (i=0; i<N; i++)
            for (j=0; j<N; j++)
            {
                if (((1<<j & column) == 0) &&
                    ((1<<i & row) == 0) &&
                    (matrix[i][j] < min))
                {
                    min = matrix[i][j];
                    x = i;
                    y = j;
                }
            }
        /* 记录找到的最小数,并标记该最小数的行列位置 */
        leastNum[count++] = min;
        row = row | 1<<x;
        column = column | 1<<y;
        /* 打印输出最小数 */
        printf("%12d", min);
    }
    printf("
");
    return 0;
}



mark一下。坐等大神回答。顺便问楼主几个问题。问题是这个演化算法啊,楼主有资料参考下不?贪心算法只能求得局部最优解,行不通。

跪求C语言编程:随机生成N*N的矩阵,选出n个最小数,要求这些数来自不同...
答:显然小于等于矩阵的维数N int count = 0; int min = 0; int row = 0; // 记录已经产生过最小数的行标识位 int column = 0; // 记录已经产生过最小数的列标识位 int x, y; /* 生成并打印随机矩阵 */ srand((unsigned int)time(NULL)); for (i=0; i<N...

c语言随机生成一个n*n的100以内的正整数输出矩阵 每列的最小值 存放...
答:**a, *b; int i,j; srand(time(NULL)); scanf("%d",&n); if(n<=0) { printf("input error\n"); return -1; } b=(int *)malloc(sizeof(int)*n); a=(int **)malloc(size

C语言编程生成n×n的矩阵,并逆时针输出。举例如下:输入3输出987216345...
答:include <stdio.h>#include <stdlib.h>int main(){int n;printf("请输入矩阵大小:");scanf("%d",&n);int arr[n][n];int i=0,j=0,s=n*n;for(i=0;i<n;i++){for(j=0;j<n;j++){arr[i][j]=0;}}int direct=0;arr[0][0]=s--;i=0;j=0;while(s>0){if(direct=...

用C语言编程序:生成一个N*N的矩阵,每个成员a[i][j]=i*N+j(i=0...N...
答:printf("请输入N:\n");scanf("%d",&N);for(i=0;i<N;i++){ for(j=0;j<N;j++){ a[i][j]=i*N+j;} } sum=0;j=N-1;for(i=0;i<N;i++){ sum=sum+a[i][j];j--;} //average=1.0*sum/N;//1.0将整型转化为浮点型 average=(float)sum/N;//或直接强制类型转...

产生n位随机数,n由键盘输入,n不大于10,用c语言!!
答:srand(time(&a)); //以系统时间为随机数种子 cin>>n;if (n==0 || n>10){ cout << "输入非法" <<endl;return 0;} result[0] = 0;while (result[0]==0) //首位不能为0 { result[0] = rand()%10;} for (i=1; i<n; i++){ result[i] = rand()%10;} for (i...

C语言 利用随机数初始化一个 N*N 的矩阵
答:include<stdio.h> include<stdlib.h> include define N 5 int main(){ int n,a[N][N],i,j;srand(time(0));for(i=0;i<N;i++){ for(j=0;j<N;j++){ a[i][j]=rand()%90+10;printf("%4d",a[i][j]);} printf("\n");} getch();} ...

c语言 随机函数 随机生成一个一维数组
答:include <stdio.h>int main(){int i,n; scanf("%d",&n); int a[n]; for(i=0;i<n;i++) scanf("%d",&a[i]); printf("已输入的数据是:\n"); for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); return 0;} ...

用C语言编写程序从键盘输入一个正整数数n,输出n!
答:编程实现计算n!,也就是n*(n-1)*(n-2)*...*1,可以通过递归函数来实现,具体实现方法:include <stdio.h>int Func(int n){if(n < 2)return 1;else return n*Func(n-1);} void main(){int n =0,m=0;printf("请输入一个正整数:")scanf("%d",&n);m=Func(n);printf("...

C语言:随机生成N个四位数并按降序排列,分别输出排序前后的N个数且每...
答:void myset(int *p,int n){//随机数生成函数 srand((unsigned)time(NULL));for(n--;n>=0;p[n--]=rand()%9000+1000);} void mysort(int *p,int n){//选择法排序 int i,j,k;for(i=0;i<n;i++){ for(k=i,j=k+1;j<n;j++)if(p[k]<p[j])k=j;if(k-i)j=p[k]...

c语言编程:输入一个正整数n,产生n个1000以内的随机数,统计其中这些随机...
答:include <stdio.h>void main(){int i,a[1000],n,k=0;scanf("%d",&n);printf("生成1000以内的随机数: ");for(i=0;i<n;i++){a[i]=("%d",rand()%1000);printf("%d ",a[i]);if(a[i]%2==0) k++;}printf("\n其中偶数的个数为%d",k);} 运行示例:...