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. MyBatis 特殊字符处理

    http://blog.csdn.net/zheng0518/article/details/10449549

  2. MVC授权认证

    处于安全性考虑,MVC可以完成授权认证,授权认证的方式如下: 1.配置Config文件,设置登录页面: <authentication mode="Forms"> &l ...

  3. poj 1006:Biorhythms(水题,经典题,中国剩余定理)

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110991   Accepted: 34541 Des ...

  4. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  5. C# SMTP邮件发送 分类: C# 2014-07-13 19:10 333人阅读 评论(1) 收藏

    邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...

  6. AndroidStudio创建新项目报错

    创建新项目自动执行时报错: Failed to import new Gradle project: failed to find Build Tools revision 17.0.0 Consul ...

  7. 使用html5的离线缓存技术

    突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...

  8. 注解:【基于外键的】Hibernate单向1->1关联

    Person与Address关联:单向1->1,[基于外键的] Person.java package org.crazyit.app.domain; import javax.persiste ...

  9. 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数

    题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...

  10. animation动画兼容所有手机

    .canvasAnim{ position: absolute; width:240px; height:240px; top:; z-index:; top:-20px; left:-5px; bo ...