藍橋杯——2016年C++A組第3題:方格填數【全排列,枚舉】

一、題目

如下的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章