69,369
社区成员
发帖
与我相关
我的任务
分享
//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;
}
//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;
}
输入 //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
输入 //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