如下的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的更多相关文章

  1. java实现第七届蓝桥杯方格填数

    方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...

  2. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  3. 蓝桥杯 方格填数 DFS 全排列 next_permutation用法

    如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...

  4. java实现第六届蓝桥杯五星填数

    五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11. 要求每条直线上数字和相等. 如图就是恰当的填法. 请你利用计算机搜索所有可能的填法有多少种. 注意:旋转或镜像后相同的算同 ...

  5. java实现第七届蓝桥杯凑平方数

    凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的. 比如:0, 36, 5948721 再比如: 1098524736 1, 25, 6390784 0, 4, 28 ...

  6. 2016年第七届蓝桥杯C/C++程序设计本科B组省赛

    /* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...

  7. 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

  8. 2016年第七届蓝桥杯c/c++省赛B组

    2016年第七届蓝桥杯c/c++省赛B组 声明:以下答案是我自己做的.不能保证正确,须要參考正确答案的请到其它地方找. 第一题 :煤球数目 题目叙述: 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个 ...

  9. java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

随机推荐

  1. asp.net 经常用到需要判断文本框是否输入的数字是小数,有无正负,几位小数,可以封装一起判断

    /// <summary> /// 判断是否为小数点数字且带符号 /// </summary> /// <param name="symbol"> ...

  2. 关于Aspose.Words插入表格单元格的高度问题的解决

    最近在工作中遇到客户要将PDF打印的文档插入的表格行高缩小.为解决这个问题,我百度了好长时间,让没有直接来说明这个问题的,我不清楚是我遇到的问题太low了,各位大神不屑一顾.终于我在几个家之所长,把问 ...

  3. 暑期培训7日游解题思路(day1~day3)

    暑期培训7日游解题思路(day1~day3) day1 第一天,王聿中老师出的题目比较简单,T1很水,T2是个简单的DP,T3还是有一点意思的.在网格图中删掉若干条边,使得所有格子都联通,求删掉的边的 ...

  4. insert into TABLE by SELECT ...

    insert into isp_rmi3 ( select r.id, r.blue_id, r.sell_channel,NULL, r.interface_id, NULL, NULL, r.ur ...

  5. flask实战-个人博客-虚拟环境、项目结构

    个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容:另一部分是博客后台,这部分内容仅 ...

  6. Python3调谷歌翻译

    公司最近有翻译的需求(本人适用的是在第三方服务器上使用,不在本地也不在谷歌控制台),发现Google的Translate API只能FQ调,但是国内也有翻译需求,经多方查找汇集众家之长,找到一个感觉最 ...

  7. keras用法

    关于Keras的“层”(Layer) 所有的Keras层对象都有如下方法: layer.get_weights():返回层的权重(numpy array) layer.set_weights(weig ...

  8. 如何在Ubuntu 16.04上安装PythonGDAL 2.1?

    sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable sudo apt update sudo apt upgrade # if yo ...

  9. Spark大型电商项目实战-及其改良之番外(1)-将spark前端页面效果高效拷贝至博客

    Spark大型电商项目实战-及其改良这个系列的时间轴展示图一直在变....1-3篇是用图直接表示时间轴,用一段简陋的html代码表示时间表.第4篇开始才是用比较完整的前端效果,能移动.缩放时间轴,鼠标 ...

  10. 【题解】Luogu P4097 [HEOI2013]Segment

    原题传送门 这珂以说是李超线段树的模板题 按着题意写就行了,时间复杂度为\(O(n\log^2n)\) #include <bits/stdc++.h> #define N 40005 # ...