Pagini recente » Cod sursa (job #2340469) | Cod sursa (job #1257645) | Cod sursa (job #398300) | Cod sursa (job #690780) | Cod sursa (job #1505233)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <vector>
#define f first
#define s second
#define maxC 10
using namespace std;
int n, i, j, x, y, z, a, b, ok, nr, l[maxC];
vector < pair < int, int> > V[maxC];
deque < pair < int, int> > q;
bool vis[maxC];
int w[maxC];
class InputReader
{
public:
InputReader() {}
InputReader(const char *file_name)
{
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(int &n)
{
while(buffer[cursor] < '0' || buffer[cursor] > '9')
{
advance();
}
n = 0;
while('0' <= buffer[cursor] && buffer[cursor] <= '9')
{
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance()
{
++ cursor;
if(cursor == SIZE)
{
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
};
void read()
{
InputReader cin("domino.in");
cin >> n;
memset(vis, 1, sizeof(vis));
for (i = 1; i <= n; ++ i)
{
cin >> x >> y;
vis[x] = vis[y] = 0;
w[x] = i + n;
w[y] = i;
V[x].push_back(make_pair(y, i));
V[y].push_back(make_pair(x, i + n));
}
for (i = 0; i < maxC; ++ i)
l[i] = V[i].size();
}
void dfs(int x)
{
int i;
vis[x] = 1;
for (i = 0; i < l[x]; ++ i)
if (!vis[V[x][i].f])
dfs(V[x][i].f);
}
void solve()
{
int p = 0;
for (b = 0; b < maxC; ++ b)
if (l[b])
{
ok = 1;
p = 0;
memset(vis, 0, sizeof(vis));
dfs(b);
for (i = 1; i < maxC; ++ i)
if ((l[i] % 2 && p) || (!vis[i] && w[i]))
{
ok = 0;
if (b == 9)
return ;
}
else if (l[i] % 2)
{
++ p;
if (i == b)
-- p;
}
if (ok)
return;
}
}
void write()
{
freopen("domino.out", "w", stdout);
if (!ok)
{
printf("0");
return ;
}
printf("1\n");
ok = 0;
q.push_back(make_pair(b, w[b]));
while (!q.empty())
{
x = q.front().f;
z = q.front().s;
if (V[x].size() == 0)
{
q.pop_front();
++ nr;
if (nr > n)
return ;
if (z <= n)
printf("%d %d\n", z, 1);
else
printf("%d %d\n", z - n, 0);
}
else
{
y = V[x].back().f;
z = V[x].back().s;
if (V[y].size())
{
if (z <= n)
V[y].erase(find(V[y].begin(), V[y].end(), make_pair(x, z + n)));
else
V[y].erase(find(V[y].begin(), V[y].end(), make_pair(x, z - n)));
}
V[x].pop_back();
q.push_front(make_pair(y, z));
}
}
}
int main()
{
read();
solve();
write();
return 0;
}