历届试题-九宫幻方-dfs暴力搜索--回溯经典

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

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

  4 9 2

  3 5 7

  8 1 6

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

  而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~ 输入格式   输入仅包含单组测试数据。

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

  对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。 输出格式   如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。 样例输入 0 7 2

0 5 0

0 3 0 样例输出 6 7 2

1 5 9

8 3 4


因为数据规模只是9,并且zida

深度搜索的过程是,每一个深度代表下一个格子,

返回zhuhanshu



#include<iostream>
#include<string.h>
using namespace std;
int p[3][3];//输入初始状态
int vis[10]= {0};//数字的占用状态
int t[3][3];//记录九宫装热爱
int is_yushe[3][3];//记录格子是不是已经预设好了
bool check1()//检查是不是九宫
{
	int sum=p[0][0]+p[0][1]+p[0][2];
	//cout<<sum<<endl;
	for(int i=1; i<3; i++)
			if(sum!=p[i][0]+p[i][1]+p[i][2])
				return false;
	if(p[0][0]+p[1][1]+p[2][2]!=sum)
		return false;
	if(p[2][0]+p[1][1]+p[0][2]!=sum)
		return false;
	for(int i=0;i<3;i++)
		if(sum!=p[0][i]+p[1][i]+p[2][i])
			return false;
	return true;
}
int cnt=0;
void dfs(int step)//step代表第几个格子
{
	if(step==10)//如果是第10个,说明前九个填写完了
	{
		if(check1())
		{
			cnt++;//九宫种类+1
			memcpy(t,p,sizeof(p));//记录其中一种九宫状态
		}
		return;
	}
	int ii=(step-1)/3;
	int jj=(step-1)%3;//分解成二维下标
	if(is_yushe[ii][jj]==1)//如果是预设,那么就进入下一个格子
		dfs(step+1);
	else
	{
		for(int i=1; i<=9; i++)
		{
			if(vis[i]==0)//如果当前数字没被用过
			{
				p[ii][jj]=i;//填入当前格子
				vis[i]=1;//标记已经用过
				dfs(step+1);//进入下一个格子
				p[ii][jj]=0;//清除格子内的数
				vis[i]=0;//标记没被用过
				//挑选下一个数
			}
		}
	}
}
int main()
{
	memset(is_yushe,0,sizeof(is_yushe));
	for(int i=0; i<3; i++)
		for(int j=0; j<3; j++)
		{
			cin>>p[i][j];
			vis[p[i][j]]=1;//标记预设的数字已使用过
			if(p[i][j]>0)
				is_yushe[i][j]=1;//标记已经预设
		}
		dfs(1);
		//cout<<cnt<<endl;
		if(cnt==1)
		{
			for(int i=0; i<3; i++)
			{
				for(int j=0; j<3; j++)
				{
					cout<<t[i][j]<<" ";
				}
				cout<<endl;
			}
		}
		else
			cout<<"Too Many";
}

    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/memeda1141/article/details/80377657
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞