#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;

int map[5][7],mark[5][7],num[13],qw,aa,flag;
int book[5][7]={      //六角图
	0,0,0,1,0,0,0,
	1,0,1,0,1,0,1,
	0,1,0,0,0,1,0,
	1,0,1,0,1,0,1,
	0,0,0,1,0,0,0
};
int next[6][2]={
	-1,1,
	0,2,
	1,1,
	1,-1,
	0,-2,
	-1,-1
};
bool pan1()
{
	int s,a,b,c,d,e;
	s=map[1][0]+map[1][2]+map[1][4]+map[1][6];
	a=map[3][0]+map[3][2]+map[3][4]+map[3][6];
	b=map[0][3]+map[1][2]+map[2][1]+map[3][0];
	c=map[0][3]+map[1][4]+map[2][5]+map[3][6];
	d=map[1][0]+map[2][1]+map[3][2]+map[4][3];
	e=map[1][6]+map[2][5]+map[3][4]+map[4][3];
	if(s==a && s==b && s==c && s==d && s==e)
		return true;
	return false;
}
bool pan2(int x,int y)
{
	if(x<0||x>4||y<0||y>6)
		return false;
	return true;
}

void dfs(int x,int y,int size)
{
	int i,j,k,x1,y1;
	if(size==12)  //如果12个数全上图
		if(pan1() && aa!=map[2][1])  //如果符合题意
		{
			/*
			printf("图%d:\n",qw++);
			for(i=0;i<5;i++)
			{
				for(j=0;j<7;j++)
					if(book[i][j])
						printf("%02d",map[i][j]);
					else
						printf("  ");
				puts("");
			}
			puts("");
			*/
			aa=map[2][1];
			printf("%d\n",aa);
			flag=1;
			return;
		}
	for(i=1;i<=12 && !flag;i++)
	{
		if(!num[i])
		{
			for(j=0;j<6 && !flag;j++)
			{
				x1=x+next[j][0];
				y1=y+next[j][1];
				if(pan2(x1,y1)&&book[x1][y1]&&!mark[x1][y1])  //没越界并且有空
				{
					mark[x1][y1]=1;
					map[x1][y1]=i;
					num[i]=1;
					dfs(x1,y1,size+1);
					map[x1][y1]=0;
					mark[x1][y1]=0;
					num[i]=0;
				}
			}
		}
	}
	return ;
}

int main()
{
	int i,j,a,b,c;
	//while(~scanf("%d%d%d",&a,&b,&c))
	//{
		scanf("%d%d%d",&a,&b,&c);
		memset(num,0,sizeof(num));
		memset(mark,0,sizeof(mark));
		qw=1;
		
		map[1][0]=a;
		map[4][3]=b;
		map[0][3]=c;
		mark[1][0]=1;
		mark[4][3]=1;
		mark[0][3]=1;
		num[a]=num[b]=num[c]=1;
		dfs(1,2,3);
//	}
	return 0;
}

题目:2014那届的六角填数那题。。。(老师改了名字搜了半天没找到以为是他原创的....)

心得:第一次做这种奇怪图形深搜,考试的时候没想出来,之后在同学的点播下有了思路完成的,主要还是图的建立吧,然后每次要搜6个方向,用一个布尔数组表示空格的位置,之后就是搜索了,总的来说还是蛮好玩的