题意:给定一个只有 ′X′ 和 ′O′ 字符串,问你可以不可以构造 a∗b 的矩阵 (a∗b=12) 使得矩阵存在一列全为 X 。输出所有情况。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define PI acos(-1.0)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
#define ll o<<1
#define rr o<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 1e4+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
void getmax(int &a, int b) {a = max(a, b); }
void getmin(int &a, int b) {a = min(a, b); }
void add(LL &x, LL y) { x += y; x %= MOD; }
int Map[20][20];
int v(char op){
if(op == 'X') return 1;
return 0;
}
char str[20];
bool judge(int row)
{
int cul = 12 / row;
int id = 1;
for(int i = 1; i <= row; i++) {
for(int j = 1; j <= cul; j++)
Map[i][j] = v(str[id++]);
}
for(int i = 1; i <= cul; i++)
{
bool flag = true;
for(int j = 1; j <= row; j++) {
if(Map[j][i] != 1) {
flag = false;
break;
}
}
if(flag) return true;
}
return false;
}
bool mark[20];
int main()
{
int n; cin >> n;
while(n--)
{
cin >> str+1; CLR(mark, false);
int ans = 0;
for(int i = 1; i <= 12; i++) {
if(12 % i == 0) {
mark[i] = judge(i);
ans += judge(i);
}
}
cout << ans; int cnt = 0;
if(ans) cout << " ";
for(int i = 1; i <= 12; i++) {
if(mark[i]) {
if(cnt) printf(" ");
printf("%dx%d", i, 12/i);
cnt++;
}
}
cout << endl;
}
return 0;
}