第七届C/C++B-方格填数 DFS
方格填数
如下的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的更多相关文章
- 第七届 蓝桥杯 方格填数 dfs
如下的10个格子 填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何 ...
- 蓝桥杯 方格填数 DFS 全排列 next_permutation用法
如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...
- java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数
6.方格填数 (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...
- 第七届蓝桥杯试题c/c++A组方格填数 回溯法
方格填数如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+(如果 ...
- 第七届蓝桥杯javaB组真题解析-方格填数(第六题)
题目 /* 方格填数 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显 ...
- java实现第七届蓝桥杯方格填数
方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...
- 第七届蓝桥杯JavaB组——第6题方格填数
解决方案:利用全排列和递归 使用Java中的集合API:HashMap ArrayList package com.lzp.lanqiaoseven.p6; import java.util.*; / ...
- java算法 蓝桥杯(题+答案) 方格填数
6.方格填数 (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...
- 蓝桥杯比赛javaB组练习《方格填数》
方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ ( ...
随机推荐
- LeetCode 191. Number of 1 bits (位1的数量)
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...
- 机器翻译评测——BLEU算法详解
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/7679284.html 前言 近年来,在自然语言研究领域中, ...
- Linux下MySQL5.7.19
第一次在自己虚机上安装mysql 中间碰到很多问题 在这里记下来,分享一下. linux centOS 6 mysql版本 mysql-5.7.19-linux-glibc2.12-x86_64.ta ...
- Idea报错Check $M2_HOME environment variable and mvn script match.
-Dmaven.multiModuleProjectDirectory=$M2_HOME
- Java 设计模式原则
1. 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起. 换句话说,如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要抽出来,和其 ...
- python中pygame模块的Linux下安装过程
一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...
- 用笔记本写C程序
首先在Visual Studio Tools 文件中打开 Visual Studio 命令提示(2010),输入命令 notepad 打开记事本,写好程序保存,保存类型:所有文档 文件名:1.c . ...
- 为JS内置对象添加常用方法
1.字符串全部替换: String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,"gm ...
- 极简版ASP.NET Core学习路径及教程
绝承认这是一个七天速成教程,即使有这个效果,我也不愿意接受这个名字.嗯. 这个路径分为两块: 实践入门 理论延伸 有了ASP.NET以及C#的知识以及项目经验,我们几乎可以不再需要了解任何新的知识就开 ...
- Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
在struts2中有很多种跳转方式如下是在struts-default.xml截取的一段源码,常用的跳转有 转发:dispatcher.重定向:redirect.转发到Action:chain.重定向 ...