要求:
相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如【图1.png】所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。
思路:运用dfs进行搜索,把整个方格填满,对特殊的情况进行处理
AC代码:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
#define rol 3
#define col 4
int visit[10];
int flag[3][4];
int mpt[3][4];
int ans=0;
void print()
{
int i,j;
for( i=0;i<3;i++)
for( j=0;j<4;j++)
flag[i][j]=1;
flag[0][0]=0;//不填入任何数
flag[2][3]=0;
}
void judge()
{
int vilid=1;
int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int x,y,k;
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(flag[i][j]==0)
{
continue;
}
for(k=0;k<8;k++)
{
x=i+dir[k][0];
y=j+dir[k][1];
if(x<0||x>2||y<0||y>3||flag[x][y]==0)
{
continue ;
}
if(abs(mpt[x][y]-mpt[i][j])==1)
{
vilid=0;//做一个标志
}
}
}
}
if(vilid)
{
ans++;
}
}
void dfs(int index)
{
int x,y;
x=index/4;
y=index%4;
if(x==3)
{
judge();
return ;
}
if(flag[x][y])
{
for(int i=0;i<10;i++)
{
if(!visit[i])
{
visit[i]=1;
mpt[x][y]=i;
dfs(index+1);
visit[i]=0;
}
}
}
else{
dfs(index+1);
}//jixufangzhi
}
int main()
{
print();
dfs(0);
printf("%d",ans);
return 0;
}