如下的10个格子 
 
填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 
一共有多少种可能的填数方案? 
请填写表示方案数目的整数。 
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

方法一:遍历

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cmath>
  5. using namespace std;
  6. int map[][];
  7. int ans=;
  8. int Abs(int i,int j)//判断 8个方向
  9. {
  10. if(abs(map[i-][j]-map[i][j])==)
  11. return ;
  12. if(abs(map[i+][j]-map[i][j])==)
  13. return ;
  14. if(abs(map[i][j+]-map[i][j])==)
  15. return ;
  16. if(abs(map[i][j-]-map[i][j])==)
  17. return ;
  18. if(abs(map[i-][j-]-map[i][j])==)
  19. return ;
  20. if(abs(map[i+][j-]-map[i][j])==)
  21. return ;
  22. if(abs(map[i-][j+]-map[i][j])==)
  23. return ;
  24. if(abs(map[i+][j+]-map[i][j])==)
  25. return ;
  26. return ;
  27. }
  28. int f()//判断相邻的数是否连续
  29. {
  30. if(Abs(,)&&Abs(,)&&Abs(,)&&Abs(,)&&Abs(,)&&Abs(,))
  31. return ;
  32. return ;
  33. }
  34. int main()
  35. {
  36. memset(map,-,sizeof(map));
  37. int a[] = {,,,,,,,,,};
  38. do{
  39. map[][]=a[];
  40. map[][]=a[];
  41. map[][]=a[];
  42. map[][]=a[];
  43. map[][]=a[];
  44. map[][]=a[];
  45. map[][]=a[];
  46. map[][]=a[];
  47. map[][]=a[];
  48. map[][]=a[];
  49. ans+=f();
  50. }while(next_permutation(a,a+));
  51. cout<<ans<<endl;
  52. return ;
  53. }

方法二: dfs

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int ans = , flag[] = {};
  5.  
  6. int Check(int a[][], int x, int y)
  7. {
  8. static int dx[] = {, -, -, -}, dy[] = {-, -, , };
  9.  
  10. for(int i = ; i < ; i ++)
  11. if( (x + dx[i] >= && x + dx[i] < ) && (y + dy[i] >= && y + dy[i] < ) )
  12. {
  13. if( == abs(a[x][y] - a[ x + dx[i] ][ y + dy[i] ]))
  14. return ;
  15. }
  16.  
  17. return ;
  18. }
  19.  
  20. void dfs(int a[][], int x, int y)
  21. {
  22. if( == x && == y){
  23. ans ++;
  24. return ;
  25. }
  26.  
  27. for(int num = ; num <= ; num ++)
  28. if(!flag[num]){
  29. a[x][y] = num;
  30. flag[num] = ;
  31.  
  32. if(Check(a, x, y)){
  33. if(y + < )
  34. dfs(a, x, y + );
  35. else
  36. dfs(a, x + , );
  37. }
  38. flag[num] = ;
  39. }
  40. }
  41.  
  42. int main()
  43. {
  44. int a[][] = {-};
  45. dfs(a, , );
  46. printf("%d", ans);
  47. return ;
  48. }

方法三:

看到这题第一个想到的方法就是回溯,就很像八皇后,能填进去就填,填不进去就看下一个位置(我做的是0---9不重复使用)

我感觉这题麻烦就在判断上

1.首先要判断一个点的8个方向相减的绝对值是否为1,为1不能填入,不为1判断是否使用过这个数,没使用填入 进行下一个位置

2.如果填入的位置到达最后一列应该换行看下一行的第一个位置进行判断

3.填到最后每一个情况总sum++就行了

上代码

  1. #include<iostream>
  2. using namespace std;
  3. int a[][];
  4. int num = ;
  5. int v[] = {};
  6. int pd(int k, int i, int j){//这个就是判断啦。。写的有点繁琐
  7. if (i->= && (a[i - ][j] == k - || a[i - ][j] == k + ) )
  8. return ;
  9. if (j->= && (a[i][j - ] == k + || a[i][j - ] == k - ) )
  10. return ;
  11. if (i->= && j->= && (a[i - ][j - ] == k + || a[i - ][j - ] == k - ))
  12. return ;
  13. if (i->= && j+< && (a[i - ][j + ] == k + || a[i - ][j + ] == k - ))
  14. return ;
  15. if (j + < && (a[i][j + ] == k + || a[i][j + ] == k - ))
  16. return ;
  17. if (i + < && (a[i + ][j] == k + || a[i + ][j] == k - ))
  18. return ;
  19. if (i + < && j - >= && (a[i + ][j - ] == k + || a[i + ][j - ] == k - ))
  20. return ;
  21. if (i + < && j + < && (a[i + ][j + ] == k + || a[i + ][j + ] == k - ))
  22. return ;
  23. return ;
  24. }
  25. void f(int i, int j){
  26. if (i == &&j==){//已经填入到最后一个说明这种情况满足,num++
  27. num++;
  28. return;
  29. }
  30. for (int k = ; k <= ; k++){
  31. if (pd(k, i, j)&&v[k]==) {//判断8个方向是否能填入,并且是否用过
  32. v[k] = ;
  33. a[i][j] = k;
  34. if (j == )//到达最后一列记得换行
  35. f(i + , );
  36. else
  37. f(i, j + );
  38. a[i][j] = -;
  39. v[k] = ;
  40. }
  41. }
  42. }
  43. int main(){
  44. for (int i = ; i < ; i++)//这里我将所有数赋值-9,因为第一个和最后一个不需要赋值,避免干扰
  45. for (int j = ; j < ; j++)
  46. a[i][j] = -;
  47. f(, );
  48. printf("%d", num);
  49. return ;
  50. }
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. /*本来要判断八个格子,
  5. *但是由于是从左往右从上往下填的,
  6. *只要判断左、左上、上、右上
  7. */
  8. const int dx[]={,-,-,-};
  9. const int dy[]={-,-,,};
  10. const int INF=1e9;
  11. bool used[];
  12. int ans=;
  13. int a[][];
  14.  
  15. bool alright(int n,int x,int y)
  16. {
  17. for (int i=;i<;i++) {
  18. int xx=x+dx[i],yy=y+dy[i];
  19. if (xx<||yy<||xx>||yy>) continue;
  20. if (abs(n-a[xx][yy])==) return false;
  21. }
  22. return true;
  23. }
  24.  
  25. void dfs(int x,int y)
  26. {
  27. if (x==&&y==) {
  28. ans++;
  29. return;
  30. }
  31. for (int i=;i<=;i++) {
  32. if (!used[i]&&alright(i,x,y)) {
  33. a[x][y]=i;
  34. used[i]=true;
  35. if (y==) dfs(x+,);
  36. else dfs(x,y+);
  37. used[i]=false;
  38. a[x][y]=-INF;
  39. }
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45. for (int i=;i<=;i++) {
  46. for (int j=;j<=;j++) {
  47. a[i][j]=-INF;
  48. }
  49. }
  50. dfs(,);
  51. printf("%d\n",ans);
  52. return ;
  53. }

第七届 蓝桥杯 方格填数 dfs的更多相关文章

  1. java实现第七届蓝桥杯方格填数

    方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...

  2. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  3. 蓝桥杯 方格填数 DFS 全排列 next_permutation用法

    如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...

  4. java实现第六届蓝桥杯五星填数

    五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11. 要求每条直线上数字和相等. 如图就是恰当的填法. 请你利用计算机搜索所有可能的填法有多少种. 注意:旋转或镜像后相同的算同 ...

  5. java实现第七届蓝桥杯凑平方数

    凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的. 比如:0, 36, 5948721 再比如: 1098524736 1, 25, 6390784 0, 4, 28 ...

  6. 2016年第七届蓝桥杯C/C++程序设计本科B组省赛

    /* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...

  7. 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

  8. 2016年第七届蓝桥杯c/c++省赛B组

    2016年第七届蓝桥杯c/c++省赛B组 声明:以下答案是我自己做的.不能保证正确,须要參考正确答案的请到其它地方找. 第一题 :煤球数目 题目叙述: 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个 ...

  9. java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

随机推荐

  1. NN元数据工作机制

    HDFS的实现思路:1.HDFS通过分布式集群来存储文件,为客户端提供便捷的访问方式2.文件存储到HDFS集群去的时候,被切分为block3.HDFS存放在若干datanode节点 上4.HDFS文件 ...

  2. Centos7 安装tomcat

  3. c# 笔记cookie

    if (Request.Cookies["svpoint"] != null) { Request.Cookies[].s_SvcID.ToString(); } else { H ...

  4. go语言入门教程:基本语法之数据类型

    出处:千锋教育go语言教研部 作者:茹姐 一.基本数据类型 以下是go中可用的基本数据类型 1.1 布尔型bool 布尔型的值只可以是常量 true 或者 false.一个简单的例子:var b bo ...

  5. go区块链学习教程之iris框架mvc架构

    在Iris框架中,封装了mvc包作为对mvc架构的支持,方便开发者遵循mvc的开发原则进行开发. iris框架支持请求数据.模型.持久数据分层处理,并支持各层级模块代码绑定执行. MVC即:model ...

  6. ceph添加osd(ceph-deploy)

    修改主机名和 /etc/hosts 关闭防火墙和 SELINUX 安装和配置 NTP ceph-deploy 节点安装 安装 ceph-deploy sudo yum install ceph-dep ...

  7. Liunx中三种网络模式配置及Xshell连接

    Liunx网络配置 NAT模式下的网络配置: 首先打开网络配置文件:vi   /etc/sysconfig/network-scripts/ifcfg-ens33 修改网卡信息,配置动态Ip过程中,只 ...

  8. Type Conversion

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本文原更新于作者的github博客,这里给出链接. 什么是转换 转换是接受一个类型的值并使用它作为另一个类型的等价值的过程.转换 ...

  9. php 使用代理IP进行数据抓取

    什么是代理?什么情况下会用到代理IP?代理服务器(Proxy Server),其功能就是代用户去取得网络信息,然后返回给用户.形象的说:它是网络信息的中转站.通过代理IP访问目标站,可以隐藏用户的真实 ...

  10. django admin使用-后台数据库管理界面

    admin是django提供的基于web的管理数据库的工具,它是django.contrib 的一部分,可以在项目的settings.py中的INSTALLED_APPS看到. 一.admin管理工具 ...