方格填数





如下的10个格子

   +--+--+--+

   |  |  |  |

+--+--+--+--+

|  |  |  |  |

+--+--+--+--+

|  |  |  |

+--+--+--+





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





填入0~9的数字。要求:连续的两个数字不能相邻。

(左右、上下、对角都算相邻)





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





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

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

思路:

DFS

优化:

因为搜索的位置是按照很纵坐标依次增大来的,所以原来设定的8个方向就可以缩短为4个方向。

测试结果:1580

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int ans[3][4];
bool bns[10];
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int sum=0;
void init()
{
memset(ans,-1,sizeof(ans));
memset(bns,false,sizeof(bns));
}
bool check(int x, int y, int num)
{
int sx,sy;
for(int i=0;i<=7;i++)
{
sx=x+dir[i][0];
sy=y+dir[i][1];
if(sx<0||sx>2||sy<0||sy>3)//越界跳过
continue;
if(ans[sx][sy]==-1)
continue;
if(fabs(ans[sx][sy]-num)==1)
return false;
}
return true;
}
void dfs(int x, int y)//位置的横坐标、纵坐标
{
for(int i=0;i<=9;i++)
{
if(!bns[i]&&check(x,y,i))//没有使用过i,并且检查可用
{
bns[i]=true;
ans[x][y]=i;
if(x==2&&y==2)
{
sum++;
}
else
{
if(y!=3)
dfs(x,y+1);
else
{
dfs(x+1,0);
}
}
bns[i]=false;
ans[x][y]=-1;
}
}
}
int main()
{
init();
dfs(0,1);
printf("%d\n",sum);//1580
return 0;
}

优化之后:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int ans[3][4];
bool bns[10];
int dir[4][2]={{-1,-1},{-1,0},{-1,1},{0,-1}};
int sum=0;
void init()
{
memset(ans,-1,sizeof(ans));
memset(bns,false,sizeof(bns));
}
bool check(int x, int y, int num)
{
int sx,sy;
for(int i=0;i<=3;i++)
{
sx=x+dir[i][0];
sy=y+dir[i][1];
if(sx<0||sx>2||sy<0||sy>3)//越界跳过
continue;
if(ans[sx][sy]==-1)
continue;
if(fabs(ans[sx][sy]-num)==1)
return false;
}
return true;
}
void dfs(int x, int y)//位置的横坐标、纵坐标
{
for(int i=0;i<=9;i++)
{
if(!bns[i]&&check(x,y,i))//没有使用过i,并且检查可用
{
bns[i]=true;
ans[x][y]=i;
if(x==2&&y==2)
{
sum++;
}
else
{
if(y!=3)
dfs(x,y+1);
else
{
dfs(x+1,0);
}
}
bns[i]=false;
ans[x][y]=-1;//优化之后这里就不用恢复现场也可以
}
}
}
int main()
{
init();
dfs(0,1);
printf("%d\n",sum);//1580
return 0;
}

第七届C/C++B-方格填数 DFS的更多相关文章

  1. 第七届 蓝桥杯 方格填数 dfs

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

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

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

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

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

  4. 第七届蓝桥杯试题c/c++A组方格填数 回溯法

    方格填数如下的10个格子   +--+--+--+   |  |  |  |+--+--+--+--+|  |  |  |  |+--+--+--+--+|  |  |  |+--+--+--+(如果 ...

  5. 第七届蓝桥杯javaB组真题解析-方格填数(第六题)

    题目 /* 方格填数 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显 ...

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

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

  7. 第七届蓝桥杯JavaB组——第6题方格填数

    解决方案:利用全排列和递归 使用Java中的集合API:HashMap ArrayList package com.lzp.lanqiaoseven.p6; import java.util.*; / ...

  8. java算法 蓝桥杯(题+答案) 方格填数

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

  9. 蓝桥杯比赛javaB组练习《方格填数》

    方格填数 如下的10个格子   +--+--+--+   |  |  |  |+--+--+--+--+|  |  |  |  |+--+--+--+--+|  |  |  |+--+--+--+ ( ...

随机推荐

  1. LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...

  2. LeetCode 122. Best Time to Buy and Sell Stock II (买卖股票的最好时机之二)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  3. 项目swift的一些问题

    在用swift做项目的时候,总会把之前oc的思想转过来. 1. 对Alamofire的再次封装,之前使用AFNetwork进行了在次封装,这样做的好处就是可以用一个全局的类来管理全部的网络请求,这样就 ...

  4. 读书笔记-你不知道的JS上-混入与原型

    继承 mixin混合继承 function mixin(obj1, obj2) { for (var key in obj2) { //重复不复制 if (!(key in obj1)) { obj1 ...

  5. Ionic3 组件懒加载

    使用懒加载能够减少程序启动时间,减少打包后的体积,而且可以很方便的使用路由的功能. 使用懒加载: 右侧红色区域可以省略掉(引用.声明也删掉) 若使用ionic命令新建page,则无需进行下面的操作,否 ...

  6. 独热编码OneHotEncoder简介

    在分类和聚类运算中我们经常计算两个个体之间的距离,对于连续的数字(Numric)这一点不成问题,但是对于名词性(Norminal)的类别,计算距离很难.即使将类别与数字对应,例如{'A','B','C ...

  7. gops - Go语言程序查看和诊断工具

    想必 Java 的开发者没有不知道或者没用过 jps 这个命令的,这个命令是用来在主机上查看有哪些 Java 程序在运行的. 我刚用 Go 语言程序的时候也很苦恼,我部署在公司服务器上的 Go 程序, ...

  8. 补写:Best Coder #85 1001 Sum(前缀和)

    sum Accepts: 640 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  9. Shuffle过程的简单介绍

    Shuffle是连接Map和Reduce的桥梁 Shuffle分为Map端的Shuffle和Reduce端的Shuffle Map端的shuffle 1输入数据和执行任务: 分片后分配Map任务,每个 ...

  10. js数组遍历some,foreach,map,filter,every对比

    1.  [...].some(ck)函数       ----      某个一个为true,则为true 对数组中每个元素执行一次ck函数,知道某个元素返回true,则直接返回true.如果都返回f ...