概率法求解三阶幻方[C语言]

#include <stdio.h>
#include <string.h>

int in[9]={1,2,3,4,5,6,7,8,9};
int s[9];
int re[3][3];

int sum(int su[])
{
    int i,re=0;
    for(i=0;su[i];i++)
        re+=su[i];
    return re;
}

int main()
{
    int i,j,k,count=0;
    memset(s,0,sizeof(s));
    int SUM = sum(in);
    if(SUM/9 != (float)SUM/9.0)
    {
        printf("wrong\n");
        return 0;
    }
    for(i=0;i<9;i++)
        for(j=i+1;j<9;j++)
            for(k=j+1;k<9;k++)
            {
                if(in[i]+in[j]+in[k] == (int)SUM/3)
                {
                    s[i]++;
                    s[j]++;
                    s[k]++;
                    count++;
                }
            }
    if(count!=8)
    {
        printf("wrong\n");
        return 0;
    }
    int flag=0;
    for(i=8;i>=0;i--)
    {
        if(s[i]==4)    re[1][1] = in[i];
        if(s[i]==3 && flag==0) { re[0][0] = in[i]; flag++; }
        else if(s[i]==3 && flag==1) { re[0][2] = in[i]; flag++; }
        else if(s[i]==3 && flag==2) { re[2][0] = in[i]; flag++; }
        else if(s[i]==3 && flag==3) { re[2][2] = in[i]; flag++; }
    }
    if(re[0][0]+re[1][1]+re[2][2]!=(int)SUM/3)
    {
        int tmp;
        tmp = re[0][0];
        re[0][0] = re[2][2];
        re[2][2] = tmp;
    }
    re[0][1] = (int)SUM/3 - re[0][0] - re[0][2];
    re[1][0] = (int)SUM/3 - re[0][0] - re[2][0];
    re[1][2] = (int)SUM/3 - re[2][2] - re[0][2];
    re[2][1] = (int)SUM/3 - re[2][2] - re[2][0];

    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d ",re[i][j]);
        }
        printf("\n");
    }
    return 0;
}

概率法求解三阶幻方[C语言]

时间: 2024-10-07 12:19:25

概率法求解三阶幻方[C语言]的相关文章

回溯法求解数独算法(C语言)

没有对输入的待解数独进行一般性验证(同一行.一列以及同一个小九宫格都不能出现重复数字) 算法利用回溯的思想: 从第一个空白处开始,找到其候选解(排除同行.同列以及同一小九宫格的所有出现过的数字,剩下未出现的数字都是候选解)的第一个值填入数独. 对第二个空白执行第一步(前面所填入的数字对此空白处有影响). 当出现某个空白的候选解个数为0时,就开始回溯,找到第一个候选解多于一个的,将其在使用的候选解设为不可取(本程序取值为-1),找到其下一个候选解,继续上面的步骤! 直到所有空白处填满,运算完成,输

幻方算法 C语言描述

幻方算法的所有情况描述及C语言表示 2019-03-30 讨论幻方前,先讨论一下动态申请数组大小 众所周知 在C语言中必须指定数组的大小 否则会报错.如果你不知道你要申请多大的数组怎么办?初始化一个非常大的数组?显然浪费空间.. 头文件#include<stdlib.h> 为我们提供了malloc函数 即动态内存分配函数 我们可以用它来为我们分配我们想要的数组大小 你想分配一个自己键盘输入大小的数组 就用malloc函数来实现(以下代码都用伪代码表示) 本题的申请数组就将用到这个方法 1.in

非负矩阵分解(3):拉格朗日乘子法求解

作者:桂. 时间:2017-04-07  07:11:54 链接:http://www.cnblogs.com/xingshansi/p/6679325.html 声明:欢迎被转载,不过记得注明出处哦~ 前言 最近发这类文章,动不动就被管理员从首页摘除,如果你觉得这个文章还说得过去,麻烦帮忙点个赞吧,这样移除的概率小一些.... 本文为非负矩阵分解系列第三篇,在第二篇中介绍了不同准则下乘法算法的推导及代码实现,这里不免有一个疑问:明明是一个约束的优化问题,虽然乘法算法巧妙地将其变为一个无约束优化

利用回溯法求解背包问题

最近看完了利用回溯法求八皇后问题,最后成功求解到92种解法,然后在看利用贪心求解背包问题,突然想到其实也可以利用回溯法求解背包问题,本质上回溯法是一个穷举的方式在求. 回溯法求解出的结果肯定是正确的,这也可以验证自己所写的贪心算法的正确性. 问题描诉: 设定Wmax为最大重量,W[](0~n-1)为编号0~n-1的货物重量,V[](0~n-1)为其价值,x[]为其中解, 在wn=ΣXi*Wi<Wmax的条件下,求Vmax=ΣXi*Vi. 代码如下: //全局变量最大价值int maxvalue=

Java三阶幻方的8种结果输出

package com.imooc.text; /** * 三阶幻方8种结果 * @author 墨北之南 * */ public class Magic { public static void main(String[] args) { int a = 0, b = 1; square1(a, b); System.out.println(); square2(a, b); System.out.println(); a = 2; b = 1; square3(a, b); System.o

梯度上升法求解Logistic回归

回顾上次内容:http://blog.csdn.net/acdreamers/article/details/27365941 经过上次对Logistic回归理论的学习,我们已经推导出取对数后的似然函数为 现在我们的目的是求一个向量,使得最大.其中 对这个似然函数求偏导后得到 根据梯度上升算法有 进一步得到 我们可以初始化向量为0,或者随机值,然后进行迭代达到指定的精度为止. 现在就来用C++一步一步实现Logistic回归,我们对文章末尾列出的数据进行训练. 首先,我们要对文本进行读取,在训练

概率法计算PI

#include <iostream> using namespace std; //概率计算PI int main() { int inside=0; double val; int i; for ( i=0; i<100000000; i++) { double x = (double)(rand())/RAND_MAX; double y = (double)(rand())/RAND_MAX; if ( (x*x + y*y) <= 1.0 ) { inside++; }

最大概率法分词及性能測试

最大概率分词是一种最主要的统计方法分词.一个待切割的字符串有多种分词结果,最大概率分词的原则是将当中概率最大的那个作为该字符串的分词结果. 第一部分 理论基础 如对一个字符串: S:有意见分歧 分词结果1: w1:有/ 意见/ 分歧/ 分词结果2: w2:有意/ 见/ 分歧/ 最大概率分词就是要求得 Max(P(w1|s),P(w2|s)) . 依据贝叶斯公式: P(w|s)=P(s|w)P(w)/P(s)                                             

Graham&#39;s Scan法求解凸包问题

概念 凸包(Convex Hull)是一个计算几何(图形学)中的概念.用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有点的.严谨的定义和相关概念参见维基百科:凸包. 这个算法是由数学大师葛立恒(Graham)发明的,他曾经是美国数学学会(AMS)主席.AT&T首席科学家以及国际杂技师协会(IJA)主席.(太汗了,这位大牛还会玩杂技~) 问题 给定平面上的二维点集,求解其凸包. 过程 1. 在所有点中选取y坐标最小的一点H,当作基点.如果存在多