一、題目
A A 2 2 3 3 4 4, 一共4對撲克牌。請你把它們排成一行。
要求:兩個A中間有1張牌,兩個2之間有2張牌,兩個3之間有3張牌,兩個4之間有4張牌。請填寫出所有符合要求的排列中,字典序最小的那個。
例如:22AA3344 比 A2A23344 字典序小。當然,它們都不是滿足要求的答案。
請通過瀏覽器提交答案。“A”一定不要用小寫字母a,也不要用“1”代替。字符間一定不要留空格。
二、思路
事實上題目已經給了提示,“不要用1代替A”,事實上我們就是要用1代替A,最後再根據1輸出A。
用12345678分別代表AA223344的下標。
因爲A和A之間要有一張牌,那麼他們之間的差就是2,以此類推,2和2之間差是3,3和3之間是4,4和4之間是5。
用STL自帶全排列:next_permutation()函數,默認是字典序的升序排列。
三、題解
#include <iostream> #include <algorithm> using namespace std; int num[8]={1,2,3,4,5,6,7,8}; int find (int a) { for (int i=0;i<8;i++) { if(num[i]==a) { return i; } } return -1; } int main() { int a; int b; int flag; do { flag=1; a=find(1); b=find(2); if(abs(a-b)!=2) { flag=0; continue; } a=find(3); b=find(4); if(abs(a-b)!=3) { flag=0; continue; } a=find(5); b=find(6); if(abs(a-b)!=4) { flag=0; continue; } a=find(7); b=find(8); if(abs(a-b)!=5) { flag=0; continue; } if(flag) { for(int i=0;i<8;i++) { if(num[i]==1 || num[i]==2) { cout << "A" ; } else { cout << (num[i]+1)/2; } } cout << endl; } }while(next_permutation(num,num+8)); return 0; }
四、結果
2342A3A4
4A3A2432
Process finished with exit code 0
要找出字典序較小的一個,那麼自然那然是2342A3A4