题干:

小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(" ");
			}
		}
	}
}