版权声明:《学习技巧》每次使用单边大脑的时间不要太久,连续使用左边大脑30分钟就如同连续使用左臂30分钟一样,周期性的交换让大脑两侧能够轮流休息,左脑活动包括了循序渐进的工作,解决逻辑问题与分析,而右脑活动包括了隐喻,创造性思考,模式匹配和可视化。 https://blog.csdn.net/intmainhhh/article/details/81814063
如下的标记y的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?(答案1580)
y | y | y | |
y | y | y | y |
y | y | y |
用dfs,代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=4;
int mp[maxn][maxn];
int flag[10];
int ans=0;
int init() {
memset(mp,-10, sizeof mp);
memset(flag,0, sizeof flag);
}
int fx[4]= {0,-1,-1,-1},fy[4]= {-1,-1,0,1};
int check(int i,int j) {
for(int f=0; f<4; f++) {
if(abs(mp[i][j]-mp[i+fx[f]][j+fy[f]])!=1||i+fx[f]<1||j+fy[f]>4||j+fy[f]<1 )
continue;
else
return 0;
}
return 1;
}
void dfs(int i,int j) {
if(i==3&&j==4) {
ans++;
return ;
}
for(int num=0; num<=9; num++) {
if(!flag[num]) {
mp[i][j]=num;
flag[num]=1;
if(check(i,j))
if(j==4)
dfs(i+1,1);
else
dfs(i,j+1);
flag[num]=0;
}
}
}
int main() {
init();
dfs(1,2);
cout<<ans;
}