Uva 1572 自组合

贴个源码// UVa1572 Self-Assembly
// Rujia Liu
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

int ID(char a1, char a2) {
  return (a1-‘A‘)*2 + (a2 == ‘+‘ ? 0 : 1);
}

int G[52][52];

// connect(A+, B-) means a border labeled with A- can be transformed to B-
void connect(char a1, char a2, char b1, char b2) {
  if(a1 == ‘0‘ || b1 == ‘0‘) return;
  int u = ID(a1, a2)^1, v = ID(b1, b2);
  G[u][v] = 1;
}

int c[52];

// returns true iff there is a cycle reachable from u
bool dfs(int u) {
  c[u] = -1;
  for(int v = 0; v < 52; v++) if(G[u][v]) {
    if(c[v] < 0) return true;
    else if(!c[v] && dfs(v)) return true;
  }
  c[u] = 1;
  return false;
}

bool find_cycle() {
  memset(c, 0, sizeof(c));
  for(int i = 0; i < 52; i++) if(!c[i])
    if(dfs(i)) return true;
  return false;
}

int main() {
  int n;
  while(scanf("%d", &n) == 1 && n) {
    memset(G, 0, sizeof(G));
    while(n--) {
      char s[10];
      scanf("%s", s);
      for(int i = 0; i < 4; i++)
        for(int j = 0; j < 4; j++) if(i != j)
          connect(s[i*2], s[i*2+1], s[j*2], s[j*2+1]);
    }
    if(find_cycle()) printf("unbounded\n");
    else printf("bounded\n");
  }
  return 0;
}
时间: 2024-12-06 14:08:27

Uva 1572 自组合的相关文章

uva 11249 - Game(组合游戏)

题目链接:uva 11249 - Game 题目大意:给定K和N,表示有N轮游戏,每轮游戏给定两堆石子的个数,两人轮流操作,每次操作可以选择一堆取任意数量的石子,也可以选两堆取,要求两堆取的石子数之差的绝对值小于K,不能操作者为输,问先手的胜负情况. 解题思路:傻逼先手才一次取完,那样的话对手直接将另一堆取光不就傻逼了.所以先手就有一个取石子的最优策略,当两堆石子的数量差小于等K的时候,先手可以一次性取完所有的. 我们设f(x)为一堆石子的数量为x时的必败态,即x,f(x),为先手必败态,x<f

UVA 1572 Self-Assembly(拓扑排序)

1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓扑排序,反之则存在. 4 // 不包含有向环的有向图称为有向无环图(DAG). 5 // 可以借助DFS完成拓扑排序:在访问完一个结点之后把它加到当前拓扑序的首部. 6 7 int c[maxn]; 8 int topo[maxn],t; 9 bool dfs(int u) 10 { 11 c[u]

uva 1572 self-assembly ——yhx

1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 int map[60][60],cnt[60]; 6 queue<int> q; 7 char s[10]; 8 int main() 9 { 10 int i,j,k,m,n,p,t,x,y,z,w,temp[5]; 11 while (~scanf("%d",&n)

UVA 1572 Self-Assembly

以颜色为节点,同一个方块上的颜色连边...看是不是有环...如果有环就可以无限延长.... Self-Assembly Problem ID: assemblyTime limit: 5 secondsMemory limit: 1024 MB DIFFICULTY 3.7 My Submissions Automatic Chemical Manufacturing is experimenting with a process called self-assembly. In this pr

UVa 1572 (拓扑排序) Self-Assembly

题意: 有n种正放形,每种正方形的数量可视为无限多.已知边与边之间的结合规则,而且正方形可以任意旋转和反转,问这n中正方形是否可以拼成无限大的图案. 分析: 首先因为可以旋转和反转,所以可以保证在拼接的过程中正方形不会自交. 把边的标号看成点,将正方形的边界A+变成B+可以看做是一条边.比如说,一个正方形中有A-和B+两条边,则A-与其他正方形中A+结合后,结合前边界为A-,结合后变为B+. 这样就得到图中的一条有向边A+ → B+ 如果能在图中找到一个环,则可以无限循环拼接正方形. 1 #in

uvalive 6393(uva 1572) Self-Assembly 拓扑排序

题意: 给出一些正方形,这些正方形的每一条边都有一个标号,这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00):这些正方形可以随意翻转和旋转,当两个正方形通过旋转或翻转,使得他们的公共边为相同大写字母并且符号相反时,他们就可以彼此结合拼在一起,现在给出n中正方形,每种正方形有无限多种,问这些正方形能否拼成一个无限大的结构. 题解: 容易想到,要使这些正方形形成无限大地结构,那么这些正方形通过拼接后一定能循环(即通过不断地拼接出现了和以

UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排序,后来知道是,可是还是不会写. 既然要拼成无限大,那么只要拼的时候拼出一个环来,又由于每个是无限多的,那么可以一直重复, 就能拼起来无限大的东西,把每个正方形看成一条边,那么不就是一个拓扑排序,看看能不能找到一个环么, 如果能找到,那么就可以,找不到,就不可以.注意的是正方形可以从四面都拼,所以要

uva 12163 - Addition-Subtraction Game(组合游戏)

题目链接:uva 12163 - Addition-Subtraction Game 题目大意:两个人进行游戏,对于每一局有一个无向图,给出无向图,每个节点有个K值,两人轮流操作,每次可以选中国一个含有石子的节点,将该节点的一个石子拿掉,然后选择K个有边连接的节点加上一个石子(节点可以重复选择),每个节点的子节点不会超过15个.不能操作的人视为失败.每局有n轮,给定每轮中每个节点上石子的初始值,问先手胜利还是失败. 解题思路:有向图上移动石子的组合游戏,对于没有子节点的节点SG值为0,然后对于每

uva 1378 - A Funny Stone Game(组合游戏)

题目链接:uva 1378 - A Funny Stone Game 题目大意:两个人玩游戏,对于一个序列,轮流操作,每次选中序列中的i,j,k三个位置要求i<j≤k,然后arr[i]减1,相应的arr[j]和arr[k]加1,不能操作的人输,问先手是否必胜,必胜的话给出字典序最下的必胜方案,负责输出-1. 解题思路:首先预处理出各个位置上的SG值,然后对于给定序列,枚举位置转移状态后判断是否为必败态即可. #include <cstdio> #include <cstring&g