#include <bits/stdc++.h>
using namespace std;
const int maxn = 1 << 9;
int edge[9][8] = {{1, 3, 9, 13, 18, 19, 21, 22}};
int in[9][4] = {{10, 11, 12, 20}};
int bits[10], test[45], G[45], goal, cnt, kase;
void init()
{
for (int i = -1, d = 0; d <= 2; d++)
for (int l = 0; l <= 2; l++)
if (++i)
{
for (int j = 0; j < 8; j++)
edge[i][j] = edge[0][j] + d * 9 + l * 2;
for (int j = 0; j < 4; j++)
in[i][j] = in[0][j] + d * 9 + l * 2;
}
}
int bitcount(int x)
{
return x == 0 ? 0 : bitcount(x / 2) + (x & 1);
}
int bitpos(int s)
{
int k = 0;
for (int i = 0; i < 9; i++)
if (s & (1 << i))
bits[k++] = i;
return k;
}
int readin()
{
string str;
int k = 0, edges = 0;
for (int i = 0; i < 5; i++)
{
if (getline(cin, str) && str[0] != '0')
for (int j = 0; j < 9; j++)
G[k++] = (str[j] == 32 ? 0 : (edges++, 1));
else return -1;
}
return edges;
}
int main(int argc, char const *argv[])
{
init();
while ((goal = readin()) && ~goal)
{
bool ans = 0;
for (int s = 0; s < maxn; s++)
{
int n = bitcount(s);//n表示有几个正方形
int k = bitpos(s);//有那几个正方形
if (n > 6 || 8 * n < goal) continue;
do
{
cnt = 0;
memset(test, 0, sizeof(test));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 8; test[edge[bits[i]][j++]] = 1)
if (!test[edge[bits[i]][j]])
cnt++;
for (int j = 0; j < 4; test[in[bits[i]][j++]] = 0)
if (test[in[bits[i]][j]])
cnt--;
}
if (cnt == goal && memcmp(test, G, 45) == 0)
{ans = 1; break;}
}
while (next_permutation(bits, bits + k));
}
cout << "Case " << ++kase << ": " << (ans ? "Yes" : "No") << endl;
}
return 0;
}
如何不重复的枚举