#include <iostream>
using namespace std;
const int MAX_SIZE = 14;
int g_elements[MAX_SIZE] = {1,1,2,3,3,4,4,5,6,6,6,7,8,9};
bool g_visited[MAX_SIZE];
bool g_pairGenerated = false;
int g_actualSize = 14;
int depth = 0;
int GetFreeSlot()
{
for (int i=0; i<g_actualSize; i++)
{
if (g_visited[i] == false)
{
return i;
}
}
return -1;
}
int GetSpecifiedSlot(int elem)
{
for (int i=0; i<g_actualSize; i++)
{
if (g_visited[i] == false && g_elements[i] == elem)
{
return i;
}
}
return -1;
}
bool MatchLink(int i, int& ref_i2, int& ref_i3)
{
int i2 = GetSpecifiedSlot(g_elements[i]+1);
if (i2 == -1)
return false;
else
g_visited[i2] = true;
int i3 = GetSpecifiedSlot(g_elements[i]+2);
if (i3 == -1)
{
g_visited[i2] = false;
return false;
}
else
g_visited[i3] = true;
for (int t=0; t<depth; t++)
cout << "-";
cout << "[" << g_elements[i] << g_elements[i2] << g_elements[i3] << "]" << endl;
ref_i2 = i2;
ref_i3 = i3;
return true;
}
bool MatchPair(int i, int& ref_i2)
{
int i2 = GetFreeSlot();
if (i2 == -1 || g_elements[i2] != g_elements[i])
return false;
g_visited[i2] = true;
for (int t=0; t<depth; t++)
cout << "-";
cout << "[" << g_elements[i] << g_elements[i2] << "]" << endl;
ref_i2 = i2;
return true;
}
int MatchTriple(int i, int& ref_i2, int& ref_i3)
{
int i2 = GetFreeSlot();
if (g_elements[i2] != g_elements[i])
return false;
else
g_visited[i2] = true;
int i3 = GetFreeSlot();
if (g_elements[i3] != g_elements[i])
{
g_visited[i2] = false;
return false;
}
else
g_visited[i3] = true;
for (int t=0; t<depth; t++)
cout << "-";
cout << "[" << g_elements[i] << g_elements[i2] << g_elements[i3] << "]" << endl;
ref_i2 = i2;
ref_i3 = i3;
return true;
}
bool Match(int i)
{
depth++;
g_visited[i] = true;
int i2, i3;
if (MatchLink(i, i2, i3))
{
int iNext = GetFreeSlot();
if (iNext == -1)
{
return true;
}
if (Match(iNext))
return true;
// recovery
g_visited[i2] = g_visited[i3] = false;
}
if (MatchTriple(i, i2, i3))
{
int iNext = GetFreeSlot();
if (iNext == -1)
{
return true;
}
if (Match(iNext))
return true;
// recovery
g_visited[i2] = g_visited[i3] = false;
}
if (!g_pairGenerated && MatchPair(i, i2))
{
g_pairGenerated = true;
int iNext = GetFreeSlot();
if (iNext == -1)
{
return true;
}
if (Match(iNext))
return true;
g_pairGenerated = false; // reset
g_visited[i2] = false;
}
depth--;
g_visited[i] = false;
return false;
}
void Hu()
{
if (g_actualSize % 3 != 2)
{
cout << "XIANGGONG" << endl;
return ;
}
g_visited[0] = true;
if (Match(0))
{
cout << "HU" << endl;
}
else
{
cout << "BU HU" << endl;
}
}
int main()
{
/*cin >> g_actualSize;
for (int i=0; i<g_actualSize; i++)
{
cin >> g_elements[i];
}*/
Hu();
return 1;
}
[OpenJudge]胡
最新推荐文章于 2024-08-18 19:10:16 发布