方格填数





如下的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. eclipse导入android studio时一些异常的处理

    Error:Execution failed for task ':app:compileDebugNdk'. > Error: Your project contains C++ files ...

  2. IIS下自定义错误页面配置的两种方式(亲测可行)--IIS服务器

    网站自定义错误页面的设置,大家应该都知道它的重要性……不多说,下面带大家一步步在IIS下设置网站自定义错误页面…… 1.首先进入你的网站主页,找到[错误页](注意是IIS下的错误页不是.NET错误页) ...

  3. css英文字符或者数字不换行的问题

    table-layout:fixed; word-break: break-all; overflow:hidden;

  4. Node.js 常用工具

    Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherit ...

  5. .NEL IL实现对象深拷贝

    对于深拷贝,通常的方法是将对象进行序列化,然后再反序化成为另一个对象.例如在stackoverflow上有这样的解决办法:https://stackoverflow.com/questions/785 ...

  6. 解决Cordova安装Cannot find module 'bplist-parser'问题

    安装完cordova出现找不到必须的模块 出现原因不明,不过如果出现这个问题,我们遇到缺什么模块就安装什么模块就可以了.如图所示

  7. PHP通过Zabbix API获取服务器监控信息

    开源监控系统Zabbix提供了丰富的API,供第三方系统调用. 基本步骤如下: 1.获取合法认证:连接对应Zabbix URL,并提供用户名和密码,HTTP方法为"POST",HT ...

  8. Python中的三种数据结构

    Python中,有3种内建的数据结构:列表.元组和字典.1.列表     list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这 ...

  9. 前端如何处理emoji表情

    这段时间在做移动端的开发, 有一个功能就是发表评论,其实这个功能本身是比较简单的, 但是在提测是的时候QA给哦提了一个bug,说输入手机自带的emoji表情发送失败了.我就奇怪了,emoji表情也是文 ...

  10. php中向前台js中传送一个二维数组

    在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...