方格填数





如下的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. angular指令之complie和link不得不说的故事

    angular指令比较晦涩难懂的就是complie和link字段了,什么时候该用complie?什么时候该用link?总是很难分别清楚.当理解了指令的真正编译原理的时候,就会发现这相当的简单. ng怎 ...

  2. Matrix Again(最大费用最大流)

    Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Tota ...

  3. Fibonacci Numbers

    Fibonacci Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  4. Node.js Stream(流)

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...

  5. css中单位 px、em 的区别【转载】

    原文:http://www.admin10000.com/document/6267.html     在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了p ...

  6. 转 html5离线储存,application cache,manifest使用体验

    html5离线应用application cache 最近在APP里新增一个论坛模块,为了快速地完成,决定将整个论坛模块做成WEB APP,WEB APP最致命的就是用户体验问题,页面跳转和过多的请求 ...

  7. Java多线程Future模式

    Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分 ...

  8. 如何实现websocket服务器-理论篇

    WebSocket 服务器简单来说就是一个遵循特殊协议监听服务器任意端口的tcp应用.搭建一个定制服务器的任务通常会让让人们感到害怕.然而基于实现一个简单的Websocket服务器没有那么麻烦. 一个 ...

  9. jQuery实现checkbox即点即改,批量计数,以及中间遇到的坑

    最近要用jQuery实现一个批量删除操作,效果如下图 最终页面page.html,此页面使用了bootstrap和jQuery,如果没有需要下载一下 <!DOCTYPE html> < ...

  10. Velocity(1)——初步入门

    1.变量 (1)变量的定义: 1 #set($name = "hello") 说明:velocity中变量是弱类型的. 2 3 当使用#set 指令时,括在双引号中的字面字符串将解 ...