hiho1268 九宫(DFS练习)

来源:互联网 发布:软件著作权 翻译 编辑:程序博客网 时间:2024/06/05 22:43

九宫

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。

三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。

九宫

有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小Hi准备将一个三阶幻方(不一定是上图中的那个)中的一些数组抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一组解。

而你呢,也被小Hi交付了同样的任务,但是不同的是,你需要写一个程序~

输入

输入仅包含单组测试数据。

每组测试数据为一个3*3的矩阵,其中为0的部分表示被小Hi抹去的部分。

对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。

输出

如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。

样例输入

0 7 2
0 5 0
0 3 0

样例输出

6 7 2
1 5 9
8 3 4

我的代码

这道题本来还有更简单的办法解决,网上搜了题解,直接打表可过。为了练习一下dfs(可参考前一篇博客),所以还是用深搜写的:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=10;int a[maxn],anss[maxn];int visit[maxn+1];int ans;bool check(int *a){    int i;    for (i=0; i<3; i++)        if ((a[i*3+0]+a[i*3+1]+a[i*3+2])!=15)            return false;    for (i=0; i<3; i++)        if ((a[i+0]+a[i+3]+a[i+6])!=15)            return false;    if ((a[0]+a[4]+a[8]!=15) || (a[2]+a[4]+a[6])!=15) return false;    return true;    }bool dfs(int pos){    if (pos>=9 && check(a))    {        ans++;        memcpy(anss,a,sizeof(a));        return true;    }    if (a[pos])        dfs(pos+1);    else    {        for (int i=1; i<=9; i++)        {            if (!visit[i])            {                visit[i]=1;                a[pos]=i;                dfs(pos+1);                visit[i]=0;                a[pos]=0;            }        }    }    return false;}int main(){    int i=0;     for (i=0; i<9; i++)    {        scanf("%d",&a[i]);        visit[a[i]]=1;    }       dfs(0);    if (ans==1)    {        for (i=0; i<9; i++)        {            printf("%d",anss[i]);            if ((i+1)%3 == 0) printf("\n");            else printf(" ");        }    }    else    {        printf("Too Many\n");    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 市公务员被定邢事拘留怎么办 四年级数学差生怎么办 给学生讲错题了怎么办 高中作弊被通报怎么办 没收到电子发票怎么办 皇冠草叶子发黄怎么办 脚痒怎么办小窍门 孩子天天玩手机怎么办 征信大数据花了怎么办 衣服容易有水印怎么办? ps楷体有锯齿怎么办 报表打印需要jre怎么办 考试忘记写名字怎么办 ems明信片没收到怎么办 580escl解锁失败怎么办 留学回国人员证明怎么办 员工不签劳动合同怎么办 在日本怎么办韩国签证 在新疆怎么办英国签证 安徽省会考没过怎么办 初中要会考了怎么办 担保人卡被冻结怎么办 188a转永居失败怎么办 刷机忘了id密码怎么办 在澳大利亚怎么办白卡 外国的工作签证怎么办 北京去澳门怎么办签注 专科挂科毕业证怎么办 新西兰预科成绩不合格怎么办 私立转公立学籍怎么办 法国留学拒签怎么办 法国留学签证被拒怎么办 英国留学拒签怎么办 在普高出国怎么办 副高职称不让出国怎么办 没学位现场确认怎么办 香港master挂科怎么办 香港研究生挂科怎么办 加拿大研究生绩点刚合格怎么办 l2续签失败 学校怎么办 珍珠柏盆景黄叶怎么办