方格填数
如下的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;
}