0
点赞
收藏
分享

微信扫一扫

【HihoCoder - 1268】九宫 (dfs,深搜)

题干:

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

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

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

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

Input

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

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

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

Output

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

Sample Input

0 7 2
0 5 0
0 3 0

Sample Output

6 7 2
1 5 9
8 3 4

解题报告:

    简化版的数独。​​POJ2676 - 数独​​

   这题要注意两个地方,ok函数中注释掉的那一部分,如果用那一部分,也可以ac。第二就是,如果用了这个第一部分,记住a数组一定要开15,开14就炸了。。。因为你是从1开始的啊!不然就会越界了、

AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int maze[4][4];
bool book[10];
int cpy[4][4];
int a[100];
int cnt;
bool ok();
void dfs(int x,int y);
void aprint();
int main()
{
int tmp;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
scanf("%d",&tmp);
maze[i][j]=tmp;
book[tmp]=true;
}
}
dfs(1,1);
if(cnt==1) {
aprint();
}
else {
printf("Too Many");
}
return 0 ;
}
void dfs(int x,int y){
// printf("");
if(x==4&&y==1){
if(ok()){
cnt++;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cpy[i][j]=maze[i][j];
}
}
}
return;
}
if(maze[x][y]==0){
for(int i=1;i<10;i++){
if(!book[i]){
book[i]=1;
maze[x][y]=i;
if(y==3){
dfs(x+1,1);
}
else{
dfs(x,y+1);
}
maze[x][y]=0;
book[i]=0;
}
}
}
else{
if(y==3){
dfs(x+1,1);
}
else{
dfs(x,y+1);
}
}
}
bool ok(){
int a[15]={0};
int flag=1;
a[1]=maze[1][1]+maze[1][2]+maze[1][3];
a[2]=maze[2][1]+maze[2][2]+maze[2][3];
a[3]=maze[3][1]+maze[3][2]+maze[3][3];
a[4]=maze[1][1]+maze[2][1]+maze[3][1];
a[5]=maze[1][2]+maze[2][2]+maze[3][2];
a[6]=maze[1][3]+maze[2][3]+maze[3][3];
a[7]=maze[1][1]+maze[2][2]+maze[3][3];
a[8]=maze[3][1]+maze[2][2]+maze[1][3];
for(int i=1;i<=8;i++){
if(a[i]!=15) flag=0;
}
return flag;
// int r1=maze[1][1]+maze[1][2]+maze[1][3];
// int r2=maze[2][1]+maze[2][2]+maze[2][3];
// int r3=maze[3][1]+maze[3][2]+maze[3][3];
// int c1=maze[1][1]+maze[2][1]+maze[3][1];
// int c2=maze[1][2]+maze[2][2]+maze[3][2];
// int c3=maze[1][3]+maze[2][3]+maze[3][3];
// int dui1=maze[1][1]+maze[2][2]+maze[3][3];
// int dui2=maze[3][1]+maze[2][2]+maze[1][3];
// a[r1]++;a[r2]++;a[r3]++;a[c1]++;a[c2]++;a[c3]++;a[dui1]++;a[dui2]++;
// if(a[15]==8) {
// return true;
// }
// else return false;
}
void aprint(){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
printf("%d",cpy[i][j]);
if(j==3){
cout <<endl;
}
else{
printf(" ");
}
}
}
}

 

举报

相关推荐

0 条评论