• 蓝桥杯 方格填数 回溯法




    方格填数


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


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


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


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


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

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

    回溯法解决的源代码如下:

    #include<iostream>
    #include<cmath>
    #include<iomanip>
    using namespace std;
    int a[3][4];
    bool part(int x,int y)
    {
    for(int i=0;i<=x;i++)
    {
    for(int j=0;j<4;j++) 
    if(a[i][j]==a[x][y]&&!(i==x&&j==y))return false;
    }

    if(x-1>=0)
    {
    if(a[x-1][y]==a[x][y])return false;
    if(abs(a[x-1][y]-a[x][y])==1)return false;
    }
    if(y-1>=0)
    {
    if(a[x][y-1]==a[x][y])return false;
    if(abs(a[x][y-1]-a[x][y])==1)return false;
    }
    if(x-1>=0&&y-1>=0){
    if(abs(a[x-1][y-1]-a[x][y])==1)return false;
    if(a[x-1][y-1]==a[x][y])return false;
    }
    if(x-1>=0&&y+1<4){
    if(abs(a[x-1][y+1]-a[x][y])==1)return false;
    if(a[x-1][y+1]==a[x][y])return false;
    }
    return true;
    }
    int main()
    {
    for(int i=0;i<3;i++)
    for(int j=0;j<4;j++)
    a[i][j]=99;//取一个不可能取到的数作初值 
    a[0][0]=99;a[2][3]=99;
    int c[11];
    for(int i=0;i<11;i++)c[i]=0;
    int k=1;int sum=0;
    while(k>=1)
    {
    while(c[k]<10)
    {
    int x=k/4;int y=k%4;
    a[x][y]=c[k]++;
    if(part(x,y)&&k==10)
    {
    sum++;
    }
    else if(part(x,y)&&k<10)k++;
    }
    a[k/4][k%4]=99;
    c[k]=0;
    k--;
    }
    cout<<sum<<endl; 
    return 0;
    }
     

  • 相关阅读:
    [LeetCode] 148. Sort List 解题思路
    [LeetCode] 21. Merge Two Sorted Lists 解题思路
    [LeetCode] 160. Intersection of Two Linked Lists 解题思路
    [LeetCode] 203. Remove Linked List Elements 解题思路
    是否是最美的6年
    Apache的Order Allow,Deny 详解
    apache 2.4 访问权限配置
    apache如何设置http自动跳转到https
    linux ssh_config和sshd_config配置文件
    mysql命令查询表的个数
  • 原文地址:https://www.cnblogs.com/linruier/p/8663214.html
Copyright © 2020-2023  润新知