69,371
社区成员
发帖
与我相关
我的任务
分享
// 未命名3.c
// 我只是尝试一下
#include <stdio.h>
#include <stdbool.h>
int tx(int, int n[*]- , bool blg
- [*][*]);
void print(int, int n[*][*]);
bool tx2(int x, int n[x][x], bool blg[x][x], bool blgs[x][x]) ;
int main(int argc, char **argv)
{
int x;
printf("输入边长:");
scanf("%d", &x);
int n[x][x];
bool blg[x][x];
bool blgs[x][x];
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
blg[i][j] = blgs[i][j] = false;
}
}
printf("输入已知的值,行列值超范围结束(行 列 值):");
int i, j, tmp;
scanf("%d %d %d", &i, &j, &tmp);
while(i > 0 && i <= x && j > 0 && j <= x) {
n[i-1][j-1] = tmp;
blg[i-1][j-1] = blgs[i-1][j-1] = true;
scanf("%d %d %d", &i, &j, &tmp);
}
if(tx(x, n, blg) == 1) {
print(x, n);
} else if(tx(x, n, blg) == -1) {
printf("很悲剧,无解\n");
} else {
printf("尝试打印一组可行的解,请耐心等待一会\n......");
if(!tx2(x, n, blg, blgs)) printf("\n尝试失败,不保证无解,只是程序尝试的范围有限");
}
return 0;
}
bool tx2(int x, int n[x][x], bool blg[x][x], bool blgs[x][x]) {
int min, max;
bool b = false;
bool flg = false;
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
if(blgs[i][j]) {
if(b) {
min = n[i][j] < min ? n[i][j] : min;
max = n[i][j] > max ? n[i][j] : max;
} else {
min = max = n[i][j];
b = true;
}
}
}
}
if(!b) {
printf("空的,所有点取同样值就行了,不用运行程序这么麻烦");
return true;
}
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
if(!blgs[i][j]) {
for(int m = min; m <= max; ++m) {
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
blg[i][j] = blgs[i][j];
}
}
blg[i][j] = true;
n[i][j] = m;
int tmp = tx(x, n, blg);
if(1 == tmp) {
flg = true;
print(x, n);
} else if(0 == tmp) {
blgs[i][j] = true;
tx2(x, n, blg, blgs);
blgs[i][j] = false;
}
}
blg[i][j] = false;
}
}
}
return flg;
}
void print(int x, int n[x][x]) {
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
printf("%d\t", n[i][j]);
}
printf("\n");
}
printf("\n");
}
bool pd(int x, bool blg[x][x]) {
bool bl = true;
for(int i = 0; bl && i < x; ++i) {
for(int j = 0; bl && j < x; ++j) {
bl = bl && blg[i][j];
}
}
return bl;
}
long tj(int x, int n[x][x], int i, int j, int ii, int jj) {
long m = 0;
for(; i < x && j < x; i += ii, j += jj) {
m += n[i][j];
}
return m;
}
int nul(int x, bool blg[x][x], int i, int j, int ii, int jj) {
int n = 0;
for(; i < x && j < x; i += ii, j += jj) {
n += (blg[i][j] ? 0 : 1);
}
return n;
}
void tx1(int x, int n[x][x], bool blg[x][x], int i, int j, int ii, int jj, int v, int h, long tmp) {
int k, l;
for(; i < x && j < x; i += ii, j += jj) {
if(!blg[i][j] && (!(i == v && j == h))) {
k = i;
l = j;
}
tmp -= n[i][j];
}
n[k][l] += tmp;
blg[k][l] = true;
}
int tx(int x, int n[x][x], bool blg[x][x]) {
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
long tmp;
bool fl = false;
if(nul(x, blg, i, 0, 0, 1) - (blg[i][j] ? 0 : 1) == 0) {
fl = true;
tmp = tj(x, n, i, 0, 0, 1);
}
if(nul(x, blg, 0, j, 1, 0) - (blg[i][j] ? 0 : 1) == 0) {
long tmp2 = tj(x, n, 0, j, 1, 0);
if(fl && (tmp != tmp2)) {
return -1;
}
fl = true;
tmp = tmp2;
}
if(i == j) {
if(nul(x, blg, 0, 0, 1, 1) - (blg[i][j] ? 0 : 1) == 0) {
int tmp2 = tj(x, n, 0, 0, 1, 1);
if(fl && (tmp != tmp2)) {
return -1;
}
fl = true;
tmp = tmp2;
}
}
if(i == x-1-j) {
if(nul(x, blg, 0, x-1, 1, -1) - (blg[i][j] ? 0 : 1) == 0) {
int tmp2 = tj(x, n, 0, x-1, 1, -1);
if(fl && (tmp != tmp2)) {
return -1;
}
fl = true;
tmp = tmp2;
}
}
if(fl) {
bool flg = false;
if(nul(x, blg, i, 0, 0, 1) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, i, 0, 0, 1, i, j, tmp);
flg = true;
}
if(nul(x, blg, 0, j, 1, 0) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, 0, j, 1, 0, i, j, tmp);
flg = true;
}
if(i == j && nul(x, blg, 0, 0, 1, 1) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, 0, 0, 1, 1, i, j, tmp);
flg = true;
}
if(i == x-1-j && nul(x, blg, 0, x-1, 1, -1) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, 0, x-1, 1, -1, i, j, tmp);
flg = true;
}
if(flg) return tx(x, n, blg);
}
}
}
return pd(x, blg) ? 1 : 0;
}
// 未命名3.c
// 我只是尝试一下
#include <stdio.h>
#include <stdbool.h>
int tx(int, int n[*]- , bool blg
- [*][*]);
void print(int, int n[*][*]);
bool tx2(int x, int n[x][x], bool blg[x][x], bool blgs[x][x]) ;
int main(int argc, char **argv)
{
//int n[3][3] = {[0][0] = -4, [1][1] = -3, [2][1] = 5};
//bool blg[3][3] = {[0][0] = true, /*[1][1] = true,*/ [2][1] = true};
//bool blgs[3][3] = {[0][0] = true, /*[1][1] = true,*/ [2][1] = true};
int x;
printf("输入边长:");
scanf("%d", &x);
int n[x][x];
bool blg[x][x];
bool blgs[x][x];
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
blg[i][j] = blgs[i][j] = false;
}
}
printf("输入已知的值,行列值超范围结束(行 列 值):");
int i, j, tmp;
scanf("%d %d %d", &i, &j, &tmp);
while(i > 0 && i <= x && j > 0 && j <= x) {
n[i-1][j-1] = tmp;
blg[i-1][j-1] = blgs[i-1][j-1] = true;
scanf("%d %d %d", &i, &j, &tmp);
}
if(tx(x, n, blg) == 1) {
print(x, n);
} else if(tx(x, n, blg) == -1) {
printf("很悲剧,无解\n");
} else {
printf("尝试打印一组可行的解,请耐心等待一会\n......");
if(!tx2(x, n, blg, blgs)) printf("\n尝试失败,不保证无解,只是程序尝试的范围有限");
}
return 0;
}
bool tx2(int x, int n[x][x], bool blg[x][x], bool blgs[x][x]) {
int min, max;
bool b = false;
bool flg = false;
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
blg[i][j] = blgs[i][j];
}
}
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
if(blg[i][j]) {
if(b) {
min = n[i][j] < min ? n[i][j] : min;
max = n[i][j] > max ? n[i][j] : max;
} else {
min = max = n[i][j];
b = true;
}
}
}
}
if(!b) {
printf("空的,所有点取同样值就行了,不用运行程序这么麻烦");
return true;
}
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
if(!blg[i][j]) {
//blg[i][j] = true;
for(int m = min; m <= max; ++m) {
blg[i][j] = true;
n[i][j] = m;
int tmp = tx(x, n, blg);
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
blg[i][j] = blgs[i][j];
}
}
if(1 == tmp) {
//printf("\n行,列,值 %d\t%d\t%d\n", i, j, m);
flg = true;
print(x, n);
} else if(0 == tmp) {
blgs[i][j] = true;
tx2(x, n, blg, blgs);
blgs[i][j] = false;
}
}
blg[i][j] = false;
}
}
}
return flg;
}
void print(int x, int n[x][x]) {
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
printf("%d\t", n[i][j]);
}
printf("\n");
}
printf("\n");
}
bool pd(int x, bool blg[x][x]) {
bool bl = true;
for(int i = 0; bl && i < 3; ++i) {
for(int j = 0; bl && j < 3; ++j) {
bl = bl && blg[i][j];
}
}
return bl;
}
long tj(int x, int n[x][x], int i, int j, int ii, int jj) {
long m = 0;
for(; i < x && j < x; i += ii, j += jj) {
m += n[i][j];
}
return m;
}
int nul(int x, bool blg[x][x], int i, int j, int ii, int jj) {
int n = 0;
for(; i < x && j < x; i += ii, j += jj) {
n += (blg[i][j] ? 0 : 1);
}
return n;
}
void tx1(int x, int n[x][x], bool blg[x][x], int i, int j, int ii, int jj, int v, int h, long tmp) {
int k, l;
for(; i < x && j < x; i += ii, j += jj) {
if(!blg[i][j] && (!(i == v && j == h))) {
k = i;
l = j;
}
tmp -= n[i][j];
}
n[k][l] += tmp;
blg[k][l] = true;
}
int tx(int x, int n[x][x], bool blg[x][x]) {
for(int i = 0; i < x; ++i) {
for(int j = 0; j < x; ++j) {
long tmp;
bool fl = false;
if(nul(x, blg, i, 0, 0, 1) - (blg[i][j] ? 0 : 1) == 0) {
fl = true;
tmp = tj(x, n, i, 0, 0, 1);
}
if(nul(x, blg, 0, j, 1, 0) - (blg[i][j] ? 0 : 1) == 0) {
long tmp2 = tj(x, n, 0, j, 1, 0);
if(fl && (tmp != tmp2)) {
return -1;
}
fl = true;
tmp = tmp2;
}
if(i == j) {
if(nul(x, blg, 0, 0, 1, 1) - (blg[i][j] ? 0 : 1) == 0) {
int tmp2 = tj(x, n, 0, 0, 1, 1);
if(fl && (tmp != tmp2)) {
return -1;
}
fl = true;
tmp = tmp2;
}
}
if(i == -j) {
if(nul(x, blg, 0, x-1, 1, -1) - (blg[i][j] ? 0 : 1) == 0) {
int tmp2 = tj(x, n, 0, x-1, 1, -1);
if(fl && (tmp != tmp2)) {
return -1;
}
fl = true;
tmp = tmp2;
}
}
if(fl) {
bool flg = false;
if(nul(x, blg, i, 0, 0, 1) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, i, 0, 0, 1, i, j, tmp);
flg = true;
}
if(nul(x, blg, 0, j, 1, 0) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, 0, j, 1, 0, i, j, tmp);
flg = true;
}
if(i == j && nul(x, blg, 0, 0, 1, 1) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, 0, 0, 1, 1, i, j, tmp);
flg = true;
}
if(i == -j && nul(x, blg, 0, x-1, 1, -1) - (blg[i][j] ? 0 : 1) == 1) {
tx1(x, n, blg, 0, x-1, 1, -1, i, j, tmp);
flg = true;
}
if(flg) return tx(x, n, blg);
}
}
}
return pd(x, blg) ? 1 : 0;
}
#include <stdio.h>
int str[9]={-4,0,0,
0,0,0,
-8,5,0};
int b[1000][9]; //保存符合条件的数据
bool judge(int a[])
{
bool jj = true;
// 横向
if( (a[0]+a[1]+a[2] != a[3]+a[4]+a[5] )||(a[3]+a[4]+a[5] != a[6]+a[7]+a[8]) )
{ jj =false; return jj;}
// 纵向
if( (a[6]+a[7]+a[8] != a[0]+a[3]+a[6] )||(a[0]+a[3]+a[6] != a[1]+a[4]+a[7] )||(a[1]+a[4]+a[7] != a[2]+a[5]+a[8]))
{ jj =false; return jj;}
//斜向
if( (a[2]+a[5]+a[8] != a[0]+a[4]+a[8])||(a[0]+a[4]+a[8] != a[2]+a[4]+a[6]))
{ jj =false; return jj;}
return jj;
}
void main()
{
int key = str[3]; //因为分析这个矩阵会发现,当str[3]确定后,事实上满足条件的矩阵已经确定,所以只需要遍历str[3]在整数范围。
int k=0;
for(key =-1000000;key<=1000000;key++)
{
str[3] = key;
str[8] = (-4+key-8)+8-5;
str[4] = (-4+key-8)+4-str[8];
str[1] = (-4+key-8)-str[4]-5;
str[2] = (-4+key-8)+8-str[4];
str[5] = (-4+key-8)-str[3]-str[4];
if(judge(str)){
for(int i=0;i<9;i++)
{
b[k][i] = str[i];
}
k++;
}
}
// 打印数据
for(int i=0;i<k;i++)
{ for(int j=0;j<9;j++)
{
printf("%d\t",b[i][j]);
if((j+1)%3 == 0)
printf("\n");
}
}
}