一、题目
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
二、思路
10个数字填进10个格子,简单来说就是排列组合 然后 排除掉 不能相邻的情况。
相邻的情况是数字之间的值相差1。那么只要取绝对值就可以了。
用到库函数的next_permutation来计算全排列。
我们对格子进行编号:
通过循环把相邻的情况排除掉。
三、题解
#include <iostream> using namespace std; int main() { int num[10]={0,1,2,3,4,5,6,7,8,9}; int ans=0; do{ if(abs(num[0]-num[1])==1 || abs(num[0]-num[3])==1 || abs(num[0]-num[4])==1 || abs(num[0]-num[5])==1 || abs(num[1]-num[4])==1 || abs(num[1]-num[5])==1 || abs(num[1]-num[6])==1 || abs(num[1]-num[2])==1 || abs(num[2]-num[5])==1 || abs(num[2]-num[6])==1 || abs(num[3]-num[4])==1 || abs(num[3]-num[7])==1 || abs(num[3]-num[8])==1 || abs(num[4]-num[5])==1 || abs(num[4]-num[7])==1 || abs(num[4]-num[8])==1 || abs(num[4]-num[9])==1 || abs(num[5]-num[8])==1 || abs(num[5]-num[9])==1 || abs(num[5]-num[6])==1 || abs(num[6]-num[9])==1 || abs(num[7]-num[8])==1 || abs(num[8]-num[9])==1 ) { continue; } else { ans++; } }while(next_permutation(num,num+10)); cout << ans << endl; return 0; }
四、结果
1580
Process finished with exit code 0