sgu 101 - Domino

Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u

Description

Dominoes – game played with small, rectangular blocks of wood or other material, each identified by a number of dots, or pips, on its face. The blocks usually are called bones, dominoes, or pieces and sometimes men, stones, or even cards.
The face of each piece is divided, by a line or ridge, into two squares, each of which is marked as would be a pair of dice...

The principle in nearly all modern dominoes games is to match one end of a piece to another that is identically or reciprocally numbered.

ENCYCLOPÆDIA BRITANNICA

Given a set of domino pieces where each side is marked with two digits from 0 to 6. Your task is to arrange pieces in a line such way, that they touch through equal marked sides. It is possible to rotate pieces changing left and right side.

Input

The first line of the input contains a single integer N (1 ≤ N ≤ 100) representing the total number of pieces in the domino set. The following N lines describe pieces. Each piece is represented on a separate line in a form of two digits from 0 to 6 separated by a space.

Output

Write “No solution” if it is impossible to arrange them described way. If it is possible, write any of way. Pieces must be written in left-to-right order. Every of N lines must contains number of current domino piece and sign “+” or “-“ (first means that you not rotate that piece, and second if you rotate it).

Sample Input

5
1 2
2 4
2 4
6 4
2 1

Sample Output

2 -
5 +
1 +
3 +
4 - //这个题目做了我一个晚上,有点头晕,还是要让自己保持冷静啊。。。 //多米诺骨牌有两个面,每个面有一个数字,相同的数字只能推倒相同数字面的骨牌,骨牌可以转向,给出的数字是严格的正面反面,问是否能推到所有的骨牌。 //如果可以输出骨牌的顺序和是否需要反转骨牌。如果不可以全部推倒,输出"No solution" //AC代码:

#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"string"
#include"cstdio"
#include"vector"
#include"cmath"
#include"queue"
using namespace std;
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define MX 401 bool vis[MX];
int Head[MX],cnt;
int indegree[MX],p[MX],siz,bin;
int fid[7]; struct Edge {
int v,nxt;
int flag;
} E[MX]; int find(int x) {
return fid[x]==x?x:(fid[x]=find(fid[x]));
} void union_root(int st,int ed) {
int rt1=find(st);
int rt2=find(ed);
if(rt1!=rt2)fid[rt2]=rt1;
} void edge_init() {
cnt=0;
siz=0;
memset(p,0);
memset(E,0);
memset(vis,0);
memset(Head,-1);
memset(indegree,0);
for(int i=0; i<=6; i++) {
fid[i]=i;
}
} void edge_add(int st,int ed,int flag) {
E[cnt].v=ed;
E[cnt].flag=flag;
E[cnt].nxt=Head[st];
Head[st]=cnt++;
} bool check() {
bin=-1;
int tot=0;
for(int i=0; i<=6; i++) {
if(vis[i]) {
if(bin==-1)bin=i;
if(indegree[i]%2) {
tot++;
if(tot>2)return 0;//判断奇数有多少个,超过两个奇数就判断不是
bin=i;
}
}
}
for(int i=0; i<=6; i++) {
if(bin!=-1)if(indegree[i]&&find(i)!=find(bin))return 0; //如果不是联通块就判断不是
}
if(bin==-1)return 0;
if(tot==1)return 0; //如果奇数只有一个判断不是
else return 1;
} void Fleury(int u,int e) {
for(int i=Head[u]; ~i; i=E[i].nxt) {
int v=E[i].v;
if(vis[i|1])continue;
vis[i|1]=1;
Fleury(v,E[i].flag);
}
if(e)p[siz++]=e; //标记是哪一条边。
} int main() {
int m,st,ed;
while(~scanf("%d",&m)) {
edge_init();
for(int i=1; i<=m; i++) {
scanf("%d%d",&st,&ed);
vis[st]=vis[ed]=1;
edge_add(st,ed,i); //正向
edge_add(ed,st,-i); //记录多米诺骨牌是否需要转向 反向
indegree[st]++;
indegree[ed]++;
union_root(st,ed); //合成联通块
}
bool flag=check();
if(!flag)puts("No solution");
else {
memset(vis,0); //再次清空标记数组
Fleury(bin,0);
for(int i=siz-1; i>=0; i--) {
printf("%d %c\n",p[i]>0?p[i]:-p[i],p[i]>0?'+':'-');
}
}
}
return 0;
}

  

ACM: SGU 101 Domino- 欧拉回路-并查集的更多相关文章

  1. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

  2. SGU 101 Domino (输出欧拉路径)

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...

  3. hdu 1116 欧拉回路+并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...

  4. HDU 1116 Play on Words(欧拉回路+并查集)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Play on Words Time Limit: 10000/5000 MS (Java/Ot ...

  5. HDU1878 欧拉回路---(并查集+图论性质)

    http://acm.hdu.edu.cn/showproblem.php?pid=1878 欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. ACM: Mr. Kitayuta's Colorful Graph-并查集-解题报

    Mr. Kitayuta's Colorful GraphTime Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...

  7. HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

    题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有 ...

  8. POJ2513——Colored Sticks(Trie树+欧拉回路+并查集)

    Colored Sticks DescriptionYou are given a bunch of wooden sticks. Each endpoint of each stick is col ...

  9. nyist 42 一笔画 (欧拉回路 + 并查集)

    nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路 ...

随机推荐

  1. Linux 通过os进程pid找到端口号

    [root@xxxx conf]# netstat -lutpn|grep tcp /java tcp /java tcp /java tomcat 监听的一些端口

  2. MVC - 11(上).DTO

    1.重要:javaScriptSerializer 无法识别被序列化的对象里各种属性是否存在  循环依赖 (System,Web.Script.Serialization.JavaScriptSeri ...

  3. WPF样式

    <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winf ...

  4. SQL跨项目查询语法

    EXEC sp_addlinkedserver 'ITSV', '', 'SQLOLEDB', '192.168.1.248' EXEC sp_addlinkedsrvlogin 'ITSV', 'f ...

  5. 【jquery】幻灯片效果

    闲着无聊,用Jquery写了一个幻灯片效果. 我这人喜欢造轮子,除了jquery这种有强大开发团队的框架级别JS,其实的一些小程序都是尽量自己写. 一是因为怕出问题了没人问,二是自己写的改起来也方便. ...

  6. ASP.NET MVCでResponse Headerのサーバーバージョンをどうやって隠しますか?

    本来是发布在客户的Wiki上的,所以用日语写. ---------------------------------------------------------------------------- ...

  7. 用with实现python的threading,新鲜啊

    哈哈,2.5以后可用.自动加锁释放,如同操作文件打开关闭一样. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading impor ...

  8. 攻城狮在路上(叁)Linux(二十二)--- linux磁盘挂载与卸载 mount umount

    挂载就是将文件系统与目录结合的操作.挂载点就是目录,该目录就是进入分区或文件系统的入口. 一.挂载前的注意事项: 1.单一文件系统不应该被重复挂载在不同的挂载点中. 2.单一目录不应该重复挂载多个文件 ...

  9. MySQL5.7中新增的JSON类型的使用方法

    创建表json_test: CREATE TABLE json_test(id INT(11) AUTO_INCREMENT PRIMARY KEY,person_desc JSON)ENGINE I ...

  10. (转载)如何借助KeePassX在Linux上管理多个密码

    转自:http://netsecurity.51cto.com/art/201311/417764.htm 如今,基于密码的身份验证在网上非常普遍,结果你恐怕数不清自己到底在使用多少个密码.实际上,据 ...