user-0 提问: 如何求矩阵中其余的元素

回复:
user: user-1
content: 引用 9 楼 supermegaboy 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 求各路大神优化，吐槽楼上代码！ 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） [/quote] 以其人之道，还治其人之身？

user: user-1
content: 看来“填表式”已经要名扬海内外了！

user: user-1
content: 稍稍优化了些，但估计仍需要运行几天！ //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; }

user: user-2
content: 引用 15 楼 u013344873 的回复:每次最喜欢看到 supermegaboy和赵老师，谈笑风生  以后请不要将我的名字与那个苦逼青年的名字放在一起，以免被人瞧不起。

user: user-1
content: 引用 13 楼 zhao4zhong1 的回复:看来“填表式”已经要名扬海内外了！ 自创C语言填表式编码风格。欢迎大家用各种语言及其编码风格来PK！ http://bbs.csdn.net/topics/380157851

user: user-3
content: 引用 14 楼 zhao4zhong1 的回复:[quote=引用 9 楼 supermegaboy 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 求各路大神优化，吐槽楼上代码！ 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） [/quote] 以其人之道，还治其人之身？[/quote]  每次最喜欢看到 supermegaboy和赵老师，谈笑风生

user: user-0
content: 正是上贴的格式

user: user-3
content: 引用 7 楼 zhao4zhong1 的回复:最笨的办法，估计需要运行几天！ //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> #define VMIN 0   //假定矩阵元素最小0 #define VMAX 99  //假定矩阵元素最大99 int hh[4];//行和 int lh[4];//列和 int zh,fh;//主（对角线）和，副（对角线）和 int jz[4][4];//矩阵 int yz[4][4];//已知矩阵 static int bz[4][4];//标志:0未知|1已知 int h,l,z;//行，列，值 int cs() {//测试，通过返回1，通不过返回0     int y,x,s,i;      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;     }     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;     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);yz[h][l]=z;bz[h][l]=1;     scanf("%d%d%d",&h,&l,&z);yz[h][l]=z;bz[h][l]=1;     scanf("%d%d%d",&h,&l,&z);yz[h][l]=z;bz[h][l]=1;     scanf("%d%d%d",&h,&l,&z);yz[h][l]=z;bz[h][l]=1;      for (jz[0][0]=((bz[0][0])?yz[0][0]:VMIN);jz[0][0]<=((bz[0][0])?yz[0][0]:VMAX);jz[0][0]++) {     for (jz[0][1]=((bz[0][1])?yz[0][1]:VMIN);jz[0][1]<=((bz[0][1])?yz[0][1]:VMAX);jz[0][1]++) {     for (jz[0][2]=((bz[0][2])?yz[0][2]:VMIN);jz[0][2]<=((bz[0][2])?yz[0][2]:VMAX);jz[0][2]++) {     for (jz[0][3]=((bz[0][3])?yz[0][3]:VMIN);jz[0][3]<=((bz[0][3])?yz[0][3]:VMAX);jz[0][3]++) {     for (jz[1][0]=((bz[1][0])?yz[1][0]:VMIN);jz[1][0]<=((bz[1][0])?yz[1][0]:VMAX);jz[1][0]++) {     for (jz[1][1]=((bz[1][1])?yz[1][1]:VMIN);jz[1][1]<=((bz[1][1])?yz[1][1]:VMAX);jz[1][1]++) {     for (jz[1][2]=((bz[1][2])?yz[1][2]:VMIN);jz[1][2]<=((bz[1][2])?yz[1][2]:VMAX);jz[1][2]++) {     for (jz[1][3]=((bz[1][3])?yz[1][3]:VMIN);jz[1][3]<=((bz[1][3])?yz[1][3]:VMAX);jz[1][3]++) {     for (jz[2][0]=((bz[2][0])?yz[2][0]:VMIN);jz[2][0]<=((bz[2][0])?yz[2][0]:VMAX);jz[2][0]++) {     for (jz[2][1]=((bz[2][1])?yz[2][1]:VMIN);jz[2][1]<=((bz[2][1])?yz[2][1]:VMAX);jz[2][1]++) {     for (jz[2][2]=((bz[2][2])?yz[2][2]:VMIN);jz[2][2]<=((bz[2][2])?yz[2][2]:VMAX);jz[2][2]++) {     for (jz[2][3]=((bz[2][3])?yz[2][3]:VMIN);jz[2][3]<=((bz[2][3])?yz[2][3]:VMAX);jz[2][3]++) {     for (jz[3][0]=((bz[3][0])?yz[3][0]:VMIN);jz[3][0]<=((bz[3][0])?yz[3][0]:VMAX);jz[3][0]++) {     for (jz[3][1]=((bz[3][1])?yz[3][1]:VMIN);jz[3][1]<=((bz[3][1])?yz[3][1]:VMAX);jz[3][1]++) {     for (jz[3][2]=((bz[3][2])?yz[3][2]:VMIN);jz[3][2]<=((bz[3][2])?yz[3][2]:VMAX);jz[3][2]++) {     for (jz[3][3]=((bz[3][3])?yz[3][3]:VMIN);jz[3][3]<=((bz[3][3])?yz[3][3]:VMAX);jz[3][3]++) {         if (cs()) {             printf("OK\n");             xs();             return 1;         }     }}}}}}}}}}}}}}}}     return 0; }   赵老师的代码真优美，颇有“填表式”的那范儿

user: user-4
content: 引用 楼主 vcgaoshou 的回复:输入 130 120 172 140 195 157 93 144 168 66 195       0 1 15 1 3 49 2 2 16 3 0 33 即矩阵4行、4列、主副对角线元素之和，以及每行一个元素（如下图），求出矩阵中其余12个元素，输出该矩阵，求代码 	157	93	144	168	 130		15			 120				49	 172			16		 140	33				 195					66  输出 22	15	28	65 49	1	21	49 53	76	16	27 33	1	79	27 去问你们的线代老师

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:求各路大神优化，吐槽楼上代码！ 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-1
content: 求各路大神优化，吐槽楼上代码！

user: user-1
content: 最笨的办法，估计需要运行几天！ //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> #define VMIN 0   //假定矩阵元素最小0 #define VMAX 99  //假定矩阵元素最大99 int hh[4];//行和 int lh[4];//列和 int zh,fh;//主（对角线）和，副（对角线）和 int jz[4][4];//矩阵 int yz[4][4];//已知矩阵 static int bz[4][4];//标志:0未知|1已知 int h,l,z;//行，列，值 int cs() {//测试，通过返回1，通不过返回0     int y,x,s,i;      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;     }     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;     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);yz[h][l]=z;bz[h][l]=1;     scanf("%d%d%d",&h,&l,&z);yz[h][l]=z;bz[h][l]=1;     scanf("%d%d%d",&h,&l,&z);yz[h][l]=z;bz[h][l]=1;     scanf("%d%d%d",&h,&l,&z);yz[h][l]=z;bz[h][l]=1;      for (jz[0][0]=((bz[0][0])?yz[0][0]:VMIN);jz[0][0]<=((bz[0][0])?yz[0][0]:VMAX);jz[0][0]++) {     for (jz[0][1]=((bz[0][1])?yz[0][1]:VMIN);jz[0][1]<=((bz[0][1])?yz[0][1]:VMAX);jz[0][1]++) {     for (jz[0][2]=((bz[0][2])?yz[0][2]:VMIN);jz[0][2]<=((bz[0][2])?yz[0][2]:VMAX);jz[0][2]++) {     for (jz[0][3]=((bz[0][3])?yz[0][3]:VMIN);jz[0][3]<=((bz[0][3])?yz[0][3]:VMAX);jz[0][3]++) {     for (jz[1][0]=((bz[1][0])?yz[1][0]:VMIN);jz[1][0]<=((bz[1][0])?yz[1][0]:VMAX);jz[1][0]++) {     for (jz[1][1]=((bz[1][1])?yz[1][1]:VMIN);jz[1][1]<=((bz[1][1])?yz[1][1]:VMAX);jz[1][1]++) {     for (jz[1][2]=((bz[1][2])?yz[1][2]:VMIN);jz[1][2]<=((bz[1][2])?yz[1][2]:VMAX);jz[1][2]++) {     for (jz[1][3]=((bz[1][3])?yz[1][3]:VMIN);jz[1][3]<=((bz[1][3])?yz[1][3]:VMAX);jz[1][3]++) {     for (jz[2][0]=((bz[2][0])?yz[2][0]:VMIN);jz[2][0]<=((bz[2][0])?yz[2][0]:VMAX);jz[2][0]++) {     for (jz[2][1]=((bz[2][1])?yz[2][1]:VMIN);jz[2][1]<=((bz[2][1])?yz[2][1]:VMAX);jz[2][1]++) {     for (jz[2][2]=((bz[2][2])?yz[2][2]:VMIN);jz[2][2]<=((bz[2][2])?yz[2][2]:VMAX);jz[2][2]++) {     for (jz[2][3]=((bz[2][3])?yz[2][3]:VMIN);jz[2][3]<=((bz[2][3])?yz[2][3]:VMAX);jz[2][3]++) {     for (jz[3][0]=((bz[3][0])?yz[3][0]:VMIN);jz[3][0]<=((bz[3][0])?yz[3][0]:VMAX);jz[3][0]++) {     for (jz[3][1]=((bz[3][1])?yz[3][1]:VMIN);jz[3][1]<=((bz[3][1])?yz[3][1]:VMAX);jz[3][1]++) {     for (jz[3][2]=((bz[3][2])?yz[3][2]:VMIN);jz[3][2]<=((bz[3][2])?yz[3][2]:VMAX);jz[3][2]++) {     for (jz[3][3]=((bz[3][3])?yz[3][3]:VMIN);jz[3][3]<=((bz[3][3])?yz[3][3]:VMAX);jz[3][3]++) {         if (cs()) {             printf("OK\n");             xs();             return 1;         }     }}}}}}}}}}}}}}}}     return 0; }

user: user-1
content: 更正上帖： 输入             //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

user: user-1
content: 输入             //4×4矩阵  130 120 172 140 //矩阵4行元素之和  195 157  93 144 //矩阵4列元素之和  168  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

user: user-5
content: 求RMB..

user: user-6
content: 矩阵图太乱了

user: user-7
content: 把原来的需求贴上来吧  你这描述完全看不懂