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行存的就是具体大小。
代码:
代码语言:javascript复制 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 }
测试结果: