蓝桥杯方格填数DFS
2016-04-21 11:35
302 查看
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
题目要求一点与和它相邻的8个点都不相差1
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int flag[3][4]; ///判断每个位置是否可以放数
bool vis[10];
int a[3][4]; ///每个位置进行放数
int sum = 0;
int s[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{1,1},{-1,-1},{-1,1},{1,-1}};
void Init() ///初始化
{
for(int i = 0; i <= 2; i ++)
for(int j = 0; j <= 3; j ++)
if(i == 0 && j == 0 || i == 2 && j == 3)
flag[i][j] = 0; ///0表示这个点不能放数
else
flag[i][j] = 1;
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
}
void solve()
{
bool t = 0;
for(int i = 0; i <= 2; i ++)///两个for语句表示2*3的矩阵
for(int j = 0; j <= 3; j ++)
{
if(!flag[i][j])///这个点不可以走
continue;
for(int k = 0; k < 8; k ++)///8个方向遍历
{
int x = i + s[k][0];
int y = j + s[k][1];
///越界判断
if(x >= 0 && x <= 2 && y >= 0 && y <= 3 && flag[x][y])
{
///左右、上下或对角有数相邻
if(fabs(a[i][j] - a[x][y] == 1))
t = 1;
}
}
}
if(!t)
++ sum;
}
void DFS(int num)
{
int r = num / 4;///行
int c = num % 4;///列
if(r > 2) ///此时表示已经全部放满
{
solve(); ///判断
return;
}
if(flag[r][c])
{
for(int i = 0; i < 10; i ++)
if(!vis[i])
{
vis[i] = 1;
a[r][c] = i;///存数
DFS(num + 1);
vis[i] = 0;
}
}
else
DFS(num + 1);
}
int main()
{
Init();
DFS(0);
cout << sum << endl;
return 0;
}
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
题目要求一点与和它相邻的8个点都不相差1
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int flag[3][4]; ///判断每个位置是否可以放数
bool vis[10];
int a[3][4]; ///每个位置进行放数
int sum = 0;
int s[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{1,1},{-1,-1},{-1,1},{1,-1}};
void Init() ///初始化
{
for(int i = 0; i <= 2; i ++)
for(int j = 0; j <= 3; j ++)
if(i == 0 && j == 0 || i == 2 && j == 3)
flag[i][j] = 0; ///0表示这个点不能放数
else
flag[i][j] = 1;
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
}
void solve()
{
bool t = 0;
for(int i = 0; i <= 2; i ++)///两个for语句表示2*3的矩阵
for(int j = 0; j <= 3; j ++)
{
if(!flag[i][j])///这个点不可以走
continue;
for(int k = 0; k < 8; k ++)///8个方向遍历
{
int x = i + s[k][0];
int y = j + s[k][1];
///越界判断
if(x >= 0 && x <= 2 && y >= 0 && y <= 3 && flag[x][y])
{
///左右、上下或对角有数相邻
if(fabs(a[i][j] - a[x][y] == 1))
t = 1;
}
}
}
if(!t)
++ sum;
}
void DFS(int num)
{
int r = num / 4;///行
int c = num % 4;///列
if(r > 2) ///此时表示已经全部放满
{
solve(); ///判断
return;
}
if(flag[r][c])
{
for(int i = 0; i < 10; i ++)
if(!vis[i])
{
vis[i] = 1;
a[r][c] = i;///存数
DFS(num + 1);
vis[i] = 0;
}
}
else
DFS(num + 1);
}
int main()
{
Init();
DFS(0);
cout << sum << endl;
return 0;
}
相关文章推荐
- C++第4次实验—双色球问题
- 7个鲜为人知却超实用的PHP函数
- c# .net使用SqlDataReader注意的几点
- Android RecyclerView初探
- java Direct Buffer
- 这个代码为什么输出不是正确结果
- ecshop_新用户注册自动发红包
- 第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用
- Python 字符串的操作
- eclipse代码注释之模板xml
- andorid布局之权重layout_weight
- Lua从入门到放弃--文件I/O
- jdk7 tar.gz 安装
- 错误解决-----Tomcat环境变量配置完成,但是cmd输入startup无法启动
- 什么是PHP无限级分类
- PHP发送邮件
- Linux /etc/skel目录
- Java开发 - 异常 - 使用throws
- 给vmware的Linux虚拟机添加硬盘
- 使用postMessage实现跨窗口消息传递