蓝桥杯 方格填数



方格填数


如下的10个格子
   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+


(如果显示有问题,也可以参看【图1.jpg】)


填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)


一共有多少种可能的填数方案?


请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

解:

本题大概念是使用dfs算法,判断处使用枚举法,与其他人使用排列判断以及是否越界类似方法来说胜在不用绞尽脑汁去想方法满足上下左右不相邻的问题。

将问题简化为一维数组  对应上面的三行四列数组,通过二维数组与一维数组的位置关系枚举满足条件。

答案:1580

#include <stdio.h>
#include <math.h>


int a[10] = {0};
static int ans = 0;


int judge(int *a)
{
    if(fabs(a[0]-a[1])!=1 && fabs(a[0]-a[3])!=1 && fabs(a[0]-a[4])!=1 && fabs(a[0]-a[5])!=1 && fabs(a[1]-a[2])!=1 && fabs(a[1]-a[4])!=1 && fabs(a[1]-a[5])!=1 && fabs(a[1]-a[6])!=1 && fabs(a[2]-a[5])!=1 && fabs(a[2]-a[6])!=1 && fabs(a[3]-a[4])!=1 && fabs(a[3]-a[7])!=1 && fabs(a[3]-a[8])!=1 && fabs(a[4]-a[5])!=1 && fabs(a[4]-a[7])!=1 && fabs(a[4]-a[8])!=1 && fabs(a[4]-a[9])!=1 && fabs(a[5]-a[6])!=1 && fabs(a[5]-a[8])!=1 && fabs(a[5]-a[9])!=1 && fabs(a[6]-a[9])!=1 && fabs(a[7]-a[8])!=1 && fabs(a[8]-a[9])!=1)
    {   
        ans++;
        return 1;   
    }
    return 0;
}
int check(int num)
{
    int i;
    for(i = num - 1;i >= 0;i--)
    {
       if(a[i] == a[num])
       {
           return 0;
       }
    }
    return 1;
}
void dfs(int num)
{
    int i;
    if(num > 9)
    {
        judge(a);
        return ;
    }
    for(i = 0; i < 10;i++)
    {
        a[num] = i;
        if(check(num))
        {
            dfs(num+1);
        }
    }
}
int main()
{
    //printf("hello\n");
    dfs(0);
    printf("%d",ans);
    return 0;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值