Uva1572——Self-Assembly
2016-03-05 09:14
369 查看
题目的意思:给你N个正方形,正方形每条边有编号,为一个大写字母加上一个“+”或者“-”,还有一个编号是“00”,“00”边不能连接其他的正方形,而想要连接需要字母相同,符号相反,问能不能无限的铺。
下面是代码,有解析。主要是dfs来判断是否存在环。
代码:
下面是代码,有解析。主要是dfs来判断是否存在环。
代码:
#include <iostream> #include <cstring> using namespace std; int c[55]; int G[55][55]; //前面26个是 代表 + 的,后面26个代表 - 的 void link(char a1, char b1, char a2, char b2) //边的连接 { //由于相同的字母,符号不同的可以相连 if(a1 == '0' || a2 == '0') return; int a, b; if(b1 == '+') //所以将 + 符号的 转换成 - 的,相当于是连接的,这步很关键 a = a1 - 'A' + 26; else if(b1 == '-') a = a1 - 'A'; if(b2 == '+') b = a2 - 'A'; else if(b2 == '-') b = a2 - 'A' + 26; G[a][b] = 1; } 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 fun() { memset(c, 0, sizeof(c)); for(int u = 0; u < 52; u++) { if(!c[u]) { if(dfs(u)) return true; } } return false; } int main() { // freopen("1.txt", "r", stdin); int n; char str[20]; while(cin >> n) { memset(G, 0, sizeof(G)); while(n--) { cin >> str; for(int i = 0; i < 8; i += 2) { for(int j = 0; j < 8; j +=2) { if(i != j) //对每个正方形都进行字母的连接 { link(str[i], str[i + 1], str[j], str[j + 1]); } } } } if(!fun()) cout << "bounded" << endl; else cout << "unbounded" << endl; } return 0; }
相关文章推荐
- 合并两个链表
- 跨浏览器resize事件分析
- NSData与UIImage之间的相互转换
- 关系型数据库-- 设计三大范式
- EasyUi的基础学习和总结
- 配置 Log4j 日志
- Overview of Batch Management
- 随机生成10条不重复长度为10以内的字符串,进行排序
- VC++调用C#生成DLL的两种方法!
- 认识Qter
- hdu2512一卡通大冒险(集合的划分问题)
- android开发之路04(初级android工程师必会,你懂得!)
- SQL Server代码如何快速格式化
- Asmcmd 详解
- Android调用拍照和本地相册并上传给服务器
- SAP 库存关联表信息
- Android中Loader及LoaderManager的使用
- ngRoute 和 ui.router 的使用方法和区别
- GDI 字体 设备上下文 绘图
- Linux find命令实例解析