您的位置:首页 > 其它

蓝桥杯方格填数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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: