蓝桥c格子填数

匿名 (未验证) 提交于 2019-12-02 23:06:17

题目:

方格填数

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

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

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

#include <iostream>  using namespace std; int mapp[3][4],book[10],ans=0; int abs(int c) {     return c>=0? c:-c; } bool check(int l,int r,int key) {     if( l == 0 && r == 0 )         return true;     else if( l == 0 )//第一行时只需要判断右边 差值大于1         return abs(key-mapp[l][r-1]) > 1;     else if( r == 0 )//第一列  上 右上 差值大于1         return abs(key-mapp[l-1][r]) > 1 && abs(key-mapp[l-1][r+1])>1;     else if( r != 3 )         return abs(key-mapp[l][r-1]) > 1 && abs(key-mapp[l-1][r]) > 1 && abs(key-mapp[l-1][r-1])>1 && abs(key-mapp[l-1][r+1])>1;     else  //第二行四列 三行四列  上 左  左上  差值大于1         return abs(key-mapp[l][r-1]) > 1 && abs(key-mapp[l-1][r]) > 1 && abs(key-mapp[l-1][r-1])>1;  } void dfs(int l,int r) {     if(l==2&&r==3){         ans++;         return ;     }     for(int i=0;i<10;i++){         if(book[i]==0&&check(l,r,i)){             book[i]=1;             mapp[l][r]=i;             dfs(l+(r+1)/4,(r+1)%4);             book[i]=0;         }     }  } int main() {     mapp[0][0]=100,mapp[2][3]=100;     for(int i=0;i<10;i++){         book[i]=0;     }     dfs(0,1);     cout<<ans<<endl;     return 0; }

 

转载请标明出处:蓝桥c格子填数
文章来源: https://blog.csdn.net/zi_mingyue/article/details/88085148
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!