#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个方向,用一个布尔数组表示空格的位置,之后就是搜索了,总的来说还是蛮好玩的