已知一个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
图示如下(括号中是该数的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; }