Question:
Solve:
总的来说就是一个带了点限制的dfs板子题
不断的去试每一个格子能填哪个数,然后进入下一个格子继续填,直到10个数字都放进去或者没法放结束
至于相邻数,可以直接写成枚举if,CV修改就行,也因此我在写代码的时候把坐标格范围扩大,然后每一格直接初始化为不可能出现的数字
其次就是注意填完数进入下一格以后要记得回溯一下
Code:
#include<bits/stdc++.h>
using namespace std;
int res = 0; //计数
int a[5][6]; //坐标格
bool num[10]; //数字填充标记
//绝对值判断
int f(int x)
{
return x < 0 ? -x : x;
}
//深搜
void dfs(int x,int y,int deep)
{
if(deep > 10){
res++;
return ;
}
for(int i = 0; i <= 9; i++){
//数字选过
if(num[i]) continue;
//十字格
if( f(a[x-1][y] - i)<=1 ) continue;
if( f(a[x+1][y] - i)<=1 ) continue;
if( f(a[x][y+1] - i)<=1 ) continue;A
if( f(a[x][y-1] - i)<=1 ) continue;
//对角
if( f(a[x+1][y+1] - i)<=1 ) continue;
if( f(a[x-1][y+1] - i)<=1 ) continue;
if( f(a[x+1][y-1] - i)<=1 ) continue;
if( f(a[x-1][y-1] - i)<=1 ) continue;
//填数,进入下一层
a[x][y] = i; num[i] = true;
if(x == 1 && y == 4) dfs(2,1,deep+1);
else if(x == 2 && y == 4) dfs(3,1,deep+1);
else dfs(x,y+1,deep+1);
//回溯
a[x][y] = -10; num[i] = false;
}
}
int main(void)
{
//初始化
memset(num,false,sizeof(num));
for(int i = 0; i <= 4; i++)
for(int j = 0; j <= 5; j++)
a[i][j] = -10;
//搜索
dfs(1,2,1);
cout <<res;
return 0;
}
声明:图片均来源于蓝桥杯官网,以个人刷题整理为目的,如若侵权,请联系删除~