方格填数

版权声明:《学习技巧》每次使用单边大脑的时间不要太久,连续使用左边大脑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;
}


 

猜你喜欢

转载自blog.csdn.net/intmainhhh/article/details/81814063