博客
关于我
第七届C/C++B-方格填数 DFS
阅读量:426 次
发布时间:2019-03-06

本文共 2692 字,大约阅读时间需要 8 分钟。

方格填数
如下的10个格子
   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。

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

思路:

DFS

优化:

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

测试结果:1580

代码:

#include
#include
#include
#include
#include
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
#include
#include
#include
#include
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;}

转载地址:http://lpjyz.baihongyu.com/

你可能感兴趣的文章
设计模式学习笔记(二十三:解释器模式)
查看>>
使用MongoDB和JSP实现一个简单的购物车系统
查看>>
算法笔记_069:Floyd算法简单介绍(Java)
查看>>
算法笔记_075:蓝桥杯练习 最短路(Java)
查看>>
from flask.ext.wtf import Form导入报错
查看>>
Python学习笔记_05:使用Flask+MySQL实现用户登陆注册以及增删查改操作
查看>>
Deepin_使用Python+MySQL创建工作日志记录
查看>>
dpdk在虚拟机上出错处理
查看>>
Nagios 系统监控基本安装配置过程详解
查看>>
Macbook 彻彻底底的卸载MySQL
查看>>
ASP.NET Core 一步步搭建个人网站(4)_主页和登录验证
查看>>
SSIS 转移数据库和SQL Server对象组件
查看>>
NumPy 学习 第四篇:数组的基本操作
查看>>
SQL Server 列存储索引 第二篇:设计
查看>>
ADF 第五篇:转换数据
查看>>
Databricks 第4篇:pyspark.sql 分组统计和窗口
查看>>
博客系列目录
查看>>
部署AlwaysOn第二步:配置AlwaysOn,创建可用性组
查看>>
PowerBI开发 第八篇:查询参数
查看>>
Execute SQL Task 第二篇:返回结果集
查看>>