方格填数-第七届蓝桥杯省赛

方格填数

如下的10个格子
在这里插入图片描述
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:1580
在这里插入图片描述
在这里插入图片描述

根据题意理解, 判断某一个格子中的数是否合法,即 判定以此格子为中心的九宫格四周数与中心数之差是否为1, 开出足够大的空间, 并赋初值, 依次判定即可

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

int sum;
int num[5][6];

bool okk(int a, int b)					//九宫格, 判定num【a】【b】是否可行
{
	for(int i = a- 1; i <= a + 1; i++)
	for(int j = b - 1; j <= b + 1; j++)
	if(abs(num[a][b] -  num[i][j]) == 1) return false;
	return true;
}

bool ok()
{
		for(int j = 2; j <= 4; j++)
		if(!okk(1, j)) return false;
		
		for(int j = 1;j <= 4; j++)
		if(!okk(2, j)) return false;
		
		for(int j = 1;j <= 3; j++)
		if(!okk(3, j)) return false;
		
		return true;
	
}

int main()
{

	int n[10];
	for(int i = 0; i < 10; i++)
	n[i] = i;
	for(int i = 0; i < 5; i++)
	for(int j = 0;  j< 6; j++)
	num[i][j] = 99999;
	
	do
	{
		int p = 0;
		for(int j = 2; j <= 4; j++)
		num[1][j] = n[p++];
		
		for(int j = 1;j <= 4; j++)
		num[2][j] = n[p++];
		
		for(int j = 1;j <= 3; j++)
		num[3][j] = n[p++];
		
		if(ok())
		sum++;
	}while(next_permutation(n, n + 10));
	cout << sum;
}

猜你喜欢

转载自blog.csdn.net/qq_40212930/article/details/88760120