第七届 蓝桥杯 方格填数 dfs
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
方法一:遍历
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int map[][];
int ans=;
int Abs(int i,int j)//判断 8个方向
{
if(abs(map[i-][j]-map[i][j])==)
return ;
if(abs(map[i+][j]-map[i][j])==)
return ;
if(abs(map[i][j+]-map[i][j])==)
return ;
if(abs(map[i][j-]-map[i][j])==)
return ;
if(abs(map[i-][j-]-map[i][j])==)
return ;
if(abs(map[i+][j-]-map[i][j])==)
return ;
if(abs(map[i-][j+]-map[i][j])==)
return ;
if(abs(map[i+][j+]-map[i][j])==)
return ;
return ;
}
int f()//判断相邻的数是否连续
{
if(Abs(,)&&Abs(,)&&Abs(,)&&Abs(,)&&Abs(,)&&Abs(,))
return ;
return ;
}
int main()
{
memset(map,-,sizeof(map));
int a[] = {,,,,,,,,,};
do{
map[][]=a[];
map[][]=a[];
map[][]=a[];
map[][]=a[];
map[][]=a[];
map[][]=a[];
map[][]=a[];
map[][]=a[];
map[][]=a[];
map[][]=a[];
ans+=f();
}while(next_permutation(a,a+));
cout<<ans<<endl;
return ;
}
方法二: dfs
#include <stdio.h>
#include <stdlib.h> int ans = , flag[] = {}; int Check(int a[][], int x, int y)
{
static int dx[] = {, -, -, -}, dy[] = {-, -, , }; for(int i = ; i < ; i ++)
if( (x + dx[i] >= && x + dx[i] < ) && (y + dy[i] >= && y + dy[i] < ) )
{
if( == abs(a[x][y] - a[ x + dx[i] ][ y + dy[i] ]))
return ;
} return ;
} void dfs(int a[][], int x, int y)
{
if( == x && == y){
ans ++;
return ;
} for(int num = ; num <= ; num ++)
if(!flag[num]){
a[x][y] = num;
flag[num] = ; if(Check(a, x, y)){
if(y + < )
dfs(a, x, y + );
else
dfs(a, x + , );
}
flag[num] = ;
}
} int main()
{
int a[][] = {-};
dfs(a, , );
printf("%d", ans);
return ;
}
方法三:
看到这题第一个想到的方法就是回溯,就很像八皇后,能填进去就填,填不进去就看下一个位置(我做的是0---9不重复使用)
我感觉这题麻烦就在判断上
1.首先要判断一个点的8个方向相减的绝对值是否为1,为1不能填入,不为1判断是否使用过这个数,没使用填入 进行下一个位置
2.如果填入的位置到达最后一列应该换行看下一行的第一个位置进行判断
3.填到最后每一个情况总sum++就行了
上代码
#include<iostream>
using namespace std;
int a[][];
int num = ;
int v[] = {};
int pd(int k, int i, int j){//这个就是判断啦。。写的有点繁琐
if (i->= && (a[i - ][j] == k - || a[i - ][j] == k + ) )
return ;
if (j->= && (a[i][j - ] == k + || a[i][j - ] == k - ) )
return ;
if (i->= && j->= && (a[i - ][j - ] == k + || a[i - ][j - ] == k - ))
return ;
if (i->= && j+< && (a[i - ][j + ] == k + || a[i - ][j + ] == k - ))
return ;
if (j + < && (a[i][j + ] == k + || a[i][j + ] == k - ))
return ;
if (i + < && (a[i + ][j] == k + || a[i + ][j] == k - ))
return ;
if (i + < && j - >= && (a[i + ][j - ] == k + || a[i + ][j - ] == k - ))
return ;
if (i + < && j + < && (a[i + ][j + ] == k + || a[i + ][j + ] == k - ))
return ;
return ;
}
void f(int i, int j){
if (i == &&j==){//已经填入到最后一个说明这种情况满足,num++
num++;
return;
}
for (int k = ; k <= ; k++){
if (pd(k, i, j)&&v[k]==) {//判断8个方向是否能填入,并且是否用过
v[k] = ;
a[i][j] = k;
if (j == )//到达最后一列记得换行
f(i + , );
else
f(i, j + );
a[i][j] = -;
v[k] = ;
}
}
}
int main(){
for (int i = ; i < ; i++)//这里我将所有数赋值-9,因为第一个和最后一个不需要赋值,避免干扰
for (int j = ; j < ; j++)
a[i][j] = -;
f(, );
printf("%d", num);
return ;
}
#include <bits/stdc++.h>
using namespace std; /*本来要判断八个格子,
*但是由于是从左往右从上往下填的,
*只要判断左、左上、上、右上
*/
const int dx[]={,-,-,-};
const int dy[]={-,-,,};
const int INF=1e9;
bool used[];
int ans=;
int a[][]; bool alright(int n,int x,int y)
{
for (int i=;i<;i++) {
int xx=x+dx[i],yy=y+dy[i];
if (xx<||yy<||xx>||yy>) continue;
if (abs(n-a[xx][yy])==) return false;
}
return true;
} void dfs(int x,int y)
{
if (x==&&y==) {
ans++;
return;
}
for (int i=;i<=;i++) {
if (!used[i]&&alright(i,x,y)) {
a[x][y]=i;
used[i]=true;
if (y==) dfs(x+,);
else dfs(x,y+);
used[i]=false;
a[x][y]=-INF;
}
}
} int main()
{
for (int i=;i<=;i++) {
for (int j=;j<=;j++) {
a[i][j]=-INF;
}
}
dfs(,);
printf("%d\n",ans);
return ;
}
第七届 蓝桥杯 方格填数 dfs的更多相关文章
- java实现第七届蓝桥杯方格填数
方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...
- java实现第七届蓝桥杯七星填数
七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...
- 蓝桥杯 方格填数 DFS 全排列 next_permutation用法
如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...
- java实现第六届蓝桥杯五星填数
五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11. 要求每条直线上数字和相等. 如图就是恰当的填法. 请你利用计算机搜索所有可能的填法有多少种. 注意:旋转或镜像后相同的算同 ...
- java实现第七届蓝桥杯凑平方数
凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的. 比如:0, 36, 5948721 再比如: 1098524736 1, 25, 6390784 0, 4, 28 ...
- 2016年第七届蓝桥杯C/C++程序设计本科B组省赛
/* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...
- 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告
2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...
- 2016年第七届蓝桥杯c/c++省赛B组
2016年第七届蓝桥杯c/c++省赛B组 声明:以下答案是我自己做的.不能保证正确,须要參考正确答案的请到其它地方找. 第一题 :煤球数目 题目叙述: 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个 ...
- java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数
6.方格填数 (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...
随机推荐
- cookiejar
referer:https://www.cnblogs.com/why957/p/9297779.html文章介绍了四种模拟登陆方法 yield Request()可以将一个新的请求返回给爬虫执行 在 ...
- Blender学习
学习顺序(下面为引用他人的视频或博客) 51个必须知道的blender操作 https://www.bilibili.com/video/av4619930/ Blender常用快捷键一览表 http ...
- laravel blog edit
模板复制create的模板 主要修改的地方 <form action="{{ url('admin/article/'.$article->id) }}" method ...
- drools kie-server和kie-workbench安装手册
Drools规则引擎可以直接在项目中编写drl文件,后调用. 也可以搭建kie-server和kie-workbench来进行远程调用. 关系: 在kie-workbench通过页面配置规则,发布到执 ...
- 关于React Native中FlatList的onEndReached属性频繁调用的一种解决办法
FlatList组件是RN0.43后引入的组件.作为高性能列表组件,FlatList在ListView的基础上优化了加载性能并简化了渲染过程.不仅如此,该组件还提供了onRefresh和onEndRe ...
- 2019 Lonsdor K518S VS K518ISE
2019 Lonsdor K518S VS K518ISE: The same: IMMO capabilities + Vehicle coverage. The difference: The u ...
- java面向对象总结(二)
Java 封装 实现Java封装的步骤 java面向对象值继承 概念: 继承的格式: 类和类之间的关系: 继承的特点: 继承的优缺点 继承的好处: 继承的缺点: 继承的注意事项: 使用继承的步骤: J ...
- vue脚手架3
跟脚手架2安装都一样,已经安装脚手架2的要执行下面的命令 ,先删除 npm uninstall vue-cli -g 或 yarn global remove vue-cli 卸载 在执行下面的命令 ...
- jquery判断点击事件是否指定区域
$(document).click(function(e){ e = window.event || e; // 兼容IE7 obj = $(e.srcElement || e.target); ...
- 1.2:Properties
文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 上一节我们了解了一个Shader的基本结构,这一节,我们从 Propert ...