
第七届C/C++B-方格填数 DFS
发布日期:2021-05-09 04:20:43
浏览次数:9
分类:博客文章
本文共 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;}
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月14日 23时46分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
线性代数应该这样学9:上三角矩阵、对角矩阵
2019-03-06
【科学计算】插值理论
2019-03-06
centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
2019-03-06
Java 读取Excel百分数保留原格式(即不转换为小数)的方法
2019-03-06
深度学习一:深度前馈网络和反向传播
2019-03-06
在wxPython使ListCtrl占据整个窗口
2019-03-06
微软面试题
2019-03-06
Google新玩法(转载)
2019-03-06
C#中Dispose和Close的区别!
2019-03-06
绝密:Google 秘密测试新版首页, 将闪聊嵌入搜索框下方!!
2019-03-06
如何让服务在流量暴增的情况下保持稳定输出
2019-03-06
一个20年技术老兵的 2020 年度技术总结
2019-03-06
EF保存平面数据到SqlServer
2019-03-06
一例完整的websocket实现群聊demo
2019-03-06
SQLSERVER数据库死锁与优化杂谈
2019-03-06
【Net】ABP框架学习之它并不那么好用
2019-03-06
Git 笔记
2019-03-06
Harbor 批量清理历史镜像
2019-03-06
使用Azure Functions玩转Serverless
2019-03-06
.NET Core 基于Websocket的在线聊天室
2019-03-06