蓝桥杯-【方格填数】【2016年省赛B组题解】

方格填数

如图,如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
请填写表示方案数目的整数。

 思路:这里利用了全排列,然后将每个格子对应一个数组表示,这里处理比较巧妙

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int a[11] = {1111,0,1,2,3,4,5,6,7,8,9};
int judge(){
    if(abs(a[1]-a[2])==1||abs(a[1]-a[4])==1||abs(a[1]-a[5])==1||abs(a[1]-a[6])==1)
        return 0;
    else if(abs(a[2]-a[5])==1||abs(a[2]-a[6])==1||abs(a[2]-a[7])==1||abs(a[2]-a[3])==1)
        return 0;
    else if(abs(a[3]-a[6])==1||abs(a[3]-a[7])==1)
        return 0;
    else if(abs(a[4]-a[5])==1||abs(a[4]-a[8])==1||abs(a[4]-a[9])==1)
        return 0;
    else if(abs(a[5]-a[6])==1||abs(a[5]-a[8])==1||abs(a[5]-a[9])==1||abs(a[5]-a[10])==1)
        return 0;
    else if(abs(a[6]-a[7])==1||abs(a[6]-a[9])==1||abs(a[6]-a[10])==1)
        return 0;
    else if(abs(a[7]-a[10])==1)
        return 0;
    else if(abs(a[8]-a[9])==1)
        return 0;
    else if(abs(a[9]-a[10])==1)
        return 0; 
    
    return 1;
}
int main(){
    int sum = 0;
    while(next_permutation(a+1,a+11)){
        if(judge())
            sum++;
    } 
    cout<<sum<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/lusiqi/p/13751611.html