UVA-1572

解题思路:

之前看到的骚操作,主要思想就是把两个面合在一起看成两个点相连,最后只要找到一个环就可以无限克隆这个环使得无限延迟.

把符号变成数字如A-变为0,A+变为1,则0^1=1 ,这两个符号可以通过^来快速转换。

实现代码:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
int cg(string s){    if(s=="00")  return -1;
    int ans = s[0] - ‘A‘;
    return ans*2+(s[1]==‘+‘);
}
int g[54][54];
int main()
{
    int n,i,j,k,a[6];
    string s1;
    while(scanf("%d",&n)!=EOF){
        memset(g,0,sizeof(g));
        for(i=0;i<n;i++){
            cin>>s1;
            for(j=0;j<4;j++)   //取得四个面的符号
                a[j] = cg(s1.substr(j*2,2));
            for(j=0;j<4;j++)    //g[x][y]  代表从x到y是否通路 = 1代表连通
                for(k=0;k<4;k++)
                    if(a[k]!=-1&&a[j]!=-1&&j!=k)  //剪枝
                        g[a[j]][a[k]^1] = 1;  //y^1代表能与x连通的点,因为x与y在一个方块上,想让另一个方块与之相连,另一个
                                              //方块必须存在y^1这个面,这样路线就由x到了y^1。
        }
        bool flag = 0;
        for(i=0;i<51;i++)
            for(j=0;j<51;j++)
                for(k=0;k<51;k++)
                g[i][j]|=g[i][k]&&g[k][j];  //合并路径,如 1-2和2-3 可以合为1-3.
        for(i=0;i<51;i++)
            flag|=g[i][i];  //路径合并完毕后查看是否存在环,如果有环,则可以无限延伸
        if(flag==0) cout<<"bounded"<<endl;
        else cout<<"unbounded"<<endl;
    }
    return 0;
}
时间: 2024-10-09 16:50:51

UVA-1572的相关文章

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

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 lab

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

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

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

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

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f