蓝桥杯:方格填数

方格填数

如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+

(如果显示有问题,也可以参看【图1.jpg】)
在这里插入图片描述
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

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

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

用了最简单的暴力法:
下面是代码,有部分注释,很容易看懂

答案:1580

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;

bool isTrue(int m,int n,int arr[3][4]){
	for(int i=m-1;i<=m+1;i++){//以arr[m][n]数字为中心,循环遍历它周围的8个数字和它是否相邻
		for(int j=n-1;j<=n+1;j++){
			//排除不在方格位置的数字和本身
			if(i>=0&&i<=2&&j>=0&&j<=3&&(!(i==0&&j==0))&&(!(i==2&&j==3))&&(!(i==m&&j==n))){
				if(abs(arr[i][j]-arr[m][n])<=1){
					return false;
				}
			}
		}
	}
	return true;
}
bool fun(int *a){
	int arr[3][4];
	int k=0;
	for(int i=0;i<3;i++){//第一个for循环 将一维数组中的10个数字放入9个方格中,除去(0,0)和(2,3)这两个位置
		for(int j=0;j<4;j++){
			if(!((i==0&&j==0)||(i==2&&j==3))){
				arr[i][j]=a[k++];
			}
		}
	}
	for(int i=0;i<3;i++){//第二个for循环 从第一个数字开始判断每个数字放的位置是否符合条件 
		for(int j=0;j<4;j++){
			if((!(i==0&&j==0))&&(!(i==2&&j==3))){
				if(!(isTrue(i,j,arr))){
				return false;
			}
			}

		}
	}
	return true;
}


int main(){
	int a[10]={0,1,2,3,4,5,6,7,8,9};
	int k=0;
	do{
		if(fun(a)){
			k++;
		}
	}while(next_permutation(a,a+10));//对一维数组中0~9这十个数字进行全排列,判断是否符合条件
	cout<<k<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值