Inna and choose option
題意:
一個由12個字符('O'或'X')組成的字符串,這12個字符可以排列成a*b(a*b=12)的矩陣,要求矩陣某一列都是'X'。用戶輸入t個字符串,都是由12個'O'或'X組成,設計函數可求解符合要求矩陣的個數,並且將符合要求的矩陣大小輸出。
Input:
第一行輸入一個整數t(Range:1-100),t表示要輸入的測試數據的個數,下面每一行輸入都是一組數據被錄入。
Output:
將每組數據的結果放在一行輸出,format:n axb axb axb ….
n表示滿足要求的矩陣個數,後面是具體的矩陣大小。
例如:
解題思路:
可以看出矩陣個數最大為6,分別是(1,12)(2,6)(3,4)(4,3)(6,2)(12,1),將這些情況枚舉出來,然後for循環判斷矩陣的每一列,若有一列滿足條件(全為'X'),那麼將這個矩陣行數列數分別保存到一個6行2列的數組的第一行,k來計數,最後k中存的就是滿足條件的矩陣個數,數組裡面前k行存的就是具體大小。
代碼:
1 #include <iostream> 2 using namespace std; 3 #include <string> 4 #define MAX 100 5 6 7 int main(void) 8 { 9 string s[MAX]; 10 int t; 11 void inna(string card); 12 cin >> t; 13 for(int i=0;i<t;i++) 14 { 15 cin >> s[i]; 16 } 17 18 for(int i=0;i<t;i++) 19 { 20 inna(s[i]); 21 } 22 return 0; 23 } 24 25 void inna(string card) 26 { 27 int i,j,k=0,m; 28 bool flag = true; 29 int a[6] = {1,2,3,4,6,12}; // 行數有六中情況 30 int b[6] = {12,6,4,3,2,1}; // 列數 31 int n[6][2]; 32 33 if(card == "OOOOOOOOOOOO") // 12張卡片全為o 34 { 35 cout << k << endl; 36 return; // 結束函數體 37 } 38 39 for(i=0;i<6;i++) // i表示行數 40 { 41 for(j=0;j<b[i];j++) 42 { 43 flag = true; 44 for(m=0;m<a[i];m++) 45 { 46 if(card[j+m*b[i]]!='X') 47 { 48 flag = false; 49 break; 50 } 51 } 52 53 if(flag) 54 { 55 n[k][0] = a[i]; 56 n[k][1] = b[i]; 57 k++; 58 break; 59 } 60 } 61 } 62 63 cout << k << ' '; 64 for(i=0;i<k;i++) 65 { 66 cout << n[i][0] << 'x' << n[i][1] << ' '; 67 } 68 cout << endl; 69 }C++ Code
測試結果: