Code Bye

编程计算4*4矩阵中剩余数字

已知一个4*4矩阵中的4个数字,以及4行4列数字之和,要求编程补充矩阵中其余数字。
图示如下(括号中是该数的2个下标),每行最右边是该行4个数字之和,最下面一行是该列数字之和
15(0,1)                                               130
49(1,3)     120
16(2,2)                            172
33(3,0)                                                             140
157        93              144               168
解决方案

40

仅供参考:
//http://bbs.csdn.net/topics/390693018
//输入             //4×4矩阵
// 130 120 172 140 //矩阵4行元素之和
// 195             //矩阵副对角线元素之和
// 157  93 144 168 //矩阵4列元素之和
// 66              //矩阵主对角线元素之和
// 195             //重复一遍,矩阵副对角线元素之和
// 0 1 15          //(0,1)处为15
// 1 3 49          //(1,3)处为49
// 2 2 16          //(2,2)处为16
// 3 0 33          //(3,0)处为33
//编程求矩阵
//输出
// 22 15 28 65
// 49  1 21 49
// 53 76 16 27
// 33  1 79 27
#include <stdio.h>
#include <conio.h>
int hh[4];//行和
int lh[4];//列和
int zh,fh;//主(对角线)和,副(对角线)和
int jz[4][4];//={//矩阵
//  {22,15,28,65},
//  {49, 1,21,49},
//  {53,76,16,27},
//  {33, 1,79,27},
//};
static int bz[4][4];//标志:0未知|1已知
int h,l,z;//行,列,值
int wz[4][3]={//当前行已知值在0,1,2,3列时对应的另三个未知列
    {1,2,3},
    {0,2,3},
    {0,1,3},
    {0,1,2},
};
int yl[4];//0,1,2,3行中已知值所在列
int cs() {//测试,通过返回1,通不过返回0
    int y,x,s,i;
    s=0;
    for (i=0;i<4;i++) {
        s+=jz[i][i];
    }
    if (s!=zh) return 0;
    s=0;
    for (i=0;i<4;i++) {
        s+=jz[i][4-1-i];
    }
    if (s!=fh) return 0;
//  for (y=0;y<4;y++) {
//      s=0;
//      for (x=0;x<4;x++) {
//          s+=jz[y][x];
//      }
//      if (s!=hh[y]) return 0;
//  }
    for (x=0;x<4;x++) {
        s=0;
        for (y=0;y<4;y++) {
            s+=jz[y][x];
        }
        if (s!=lh[x]) return 0;
    }
    return 1;
}
void xs() {//显示
    int y,x;
    for (y=0;y<4;y++) {
        for (x=0;x<4;x++) {
            printf("%3d",jz[y][x]);
        }
        printf("\n");
    }
    printf("\n");
}
int main() {
    for (h=0;h<4;h++) scanf("%d",&hh[h]);
    scanf("%d",&fh);
    for (l=0;l<4;l++) scanf("%d",&lh[l]);
    scanf("%d",&zh);
    scanf("%*d");
    scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;
    scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;
    scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;
    scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;
//  if (cs()) {
//      printf("OK\n");
//      xs();
//      return 1;
//  }
    for (jz[0][wz[yl[0]][0]]=0; jz[0][wz[yl[0]][0]]<hh[0]-jz[0][yl[0]]                                        ; jz[0][wz[yl[0]][0]]++) {
    for (jz[0][wz[yl[0]][1]]=0; jz[0][wz[yl[0]][1]]<hh[0]-jz[0][yl[0]]-jz[0][wz[yl[0]][0]]                    ; jz[0][wz[yl[0]][1]]++) {
         jz[0][wz[yl[0]][2]]=                       hh[0]-jz[0][yl[0]]-jz[0][wz[yl[0]][0]]-jz[0][wz[yl[0]][1]];
    for (jz[1][wz[yl[1]][0]]=0; jz[1][wz[yl[1]][0]]<hh[1]-jz[1][yl[1]]                                        ; jz[1][wz[yl[1]][0]]++) {
    for (jz[1][wz[yl[1]][1]]=0; jz[1][wz[yl[1]][1]]<hh[1]-jz[1][yl[1]]-jz[1][wz[yl[1]][0]]                    ; jz[1][wz[yl[1]][1]]++) {
         jz[1][wz[yl[1]][2]]=                       hh[1]-jz[1][yl[1]]-jz[1][wz[yl[1]][0]]-jz[1][wz[yl[1]][1]];
    for (jz[2][wz[yl[2]][0]]=0; jz[2][wz[yl[2]][0]]<hh[2]-jz[2][yl[2]]                                        ; jz[2][wz[yl[2]][0]]++) {
    for (jz[2][wz[yl[2]][1]]=0; jz[2][wz[yl[2]][1]]<hh[2]-jz[2][yl[2]]-jz[2][wz[yl[2]][0]]                    ; jz[2][wz[yl[2]][1]]++) {
         jz[2][wz[yl[2]][2]]=                       hh[2]-jz[2][yl[2]]-jz[2][wz[yl[2]][0]]-jz[2][wz[yl[2]][1]];
    for (jz[3][wz[yl[3]][0]]=0; jz[3][wz[yl[3]][0]]<hh[3]-jz[3][yl[3]]                                        ; jz[3][wz[yl[3]][0]]++) {
    for (jz[3][wz[yl[3]][1]]=0; jz[3][wz[yl[3]][1]]<hh[3]-jz[3][yl[3]]-jz[3][wz[yl[3]][0]]                    ; jz[3][wz[yl[3]][1]]++) {
         jz[3][wz[yl[3]][2]]=                       hh[3]-jz[3][yl[3]]-jz[3][wz[yl[3]][0]]-jz[3][wz[yl[3]][1]];
//      xs();getch();
//      if (kbhit()) {getch();xs();}
        if (cs()) {
            printf("OK\n");
            xs();
            return 1;
        }
    }} }} }} }}
    printf("Can not find it!\n");
    return 0;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明编程计算4*4矩阵中剩余数字