一、題目
如下的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