POJ--1128--Frame Stacking【拓扑排序】
来源:互联网 发布:windows update更新慢 编辑:程序博客网 时间:2024/06/12 21:03
链接:http://poj.org/problem?id=1128
题意:有几张图片,给你叠加到一起之后的图,问叠加的可能性,如有多种可能则按字典序由小到大输出。
思路:根据给出的图形建一个图,被覆盖的图片向覆盖它的图片建边,然后拓扑排序。
拓扑排序按照字母顺序从小到大找入度为0的点,用dfs形式的拓扑排序,就按照字典序输出了。
POJ1270的做法也类似: 代码
#include<cstring>#include<string>#include<fstream>#include<iostream>#include<iomanip>#include<cstdio>#include<cctype>#include<algorithm>#include<queue>#include<deque>#include<map>#include<set>#include<vector>#include<stack>#include<ctime>#include<cstdlib>#include<functional>#include<cmath>using namespace std;#define PI acos(-1.0)#define MAXN 35#define eps 1e-7#define INF 0x3F3F3F3F //0x7FFFFFFF#define LLINF 0x7FFFFFFFFFFFFFFF#define seed 1313131#define MOD 1000000007#define ll long long#define ull unsigned ll#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct node{ int x, y;}left_top[MAXN], right_bottom[MAXN];int n, m, tot;int edge[MAXN][MAXN], in[MAXN];char mapp[MAXN][MAXN];char str[MAXN];int vis[MAXN];void dfs(int len){ int i, j; if(len == tot){ puts(str); return ; } for(i = 0; i < 26; i++){ if(!vis[i]) continue; if(in[i] == 0){ in[i] = -1; str[len] = i + 'A'; for(j = 0; j < 26; j++){ if(edge[i][j]) in[j]--; } dfs(len + 1); for(j = 0; j < 26; j++){ if(edge[i][j]) in[j]++; } in[i] = 0; } }}int main(){ int i, j, k; while(scanf("%d%d", &n, &m) != EOF){ memset(edge, 0, sizeof(edge)); memset(in, 0, sizeof(in)); memset(vis, 0, sizeof(vis)); memset(str, 0, sizeof(str)); for(i = 0; i < MAXN; i++){ left_top[i].x = left_top[i].y = INF; right_bottom[i].x = right_bottom[i].y = 0; } for(i = 0; i < n; i++) scanf("%s", mapp[i]); for(i = 0; i < n; i++){ for(j = 0; j < m; j++){ if(mapp[i][j] == '.') continue; int temp = mapp[i][j] - 'A'; if(left_top[temp].x > i) left_top[temp].x = i; if(left_top[temp].y > j) left_top[temp].y = j; if(right_bottom[temp].x < i) right_bottom[temp].x = i; if(right_bottom[temp].y < j) right_bottom[temp].y = j; } } tot = 0; for(i = 0; i < 26; i++){ if(left_top[i].x == INF) continue; tot++; vis[i] = 1; for(j = left_top[i].x; j <= right_bottom[i].x; j++){ if(mapp[j][left_top[i].y] != i + 'A') edge[i][mapp[j][left_top[i].y] - 'A'] = 1; if(mapp[j][right_bottom[i].y] != i + 'A') edge[i][mapp[j][right_bottom[i].y] - 'A'] = 1; } for(j = left_top[i].y + 1; j <= right_bottom[i].y - 1; j++){ if(mapp[left_top[i].x][j] != i + 'A') edge[i][mapp[left_top[i].x][j] - 'A'] = 1; if(mapp[right_bottom[i].x][j] != i + 'A') edge[i][mapp[right_bottom[i].x][j] - 'A'] = 1; } } for(i = 0; i < MAXN; i++){ for(j = 0; j < MAXN; j++){ if(edge[i][j]) in[j]++; } } dfs(0); } return 0;}
0 0
- POJ 1128 Frame Stacking (拓扑排序)
- poj 1128 Frame Stacking (建图+拓扑排序)
- [POJ 1128] Frame Stacking (拓扑排序)
- POJ--1128--Frame Stacking【拓扑排序】
- poj 1128 Frame Stacking(拓扑排序)
- POJ 1128 Frame Stacking dfs+拓扑排序
- POJ 1128 Frame Stacking 拓扑排序+暴搜
- POJ 1128 Frame Stacking(拓扑排序)
- poj 1128 Frame Stacking 拓扑
- poj 1128 Frame Stacking(DFS+拓扑排序)
- POJ 1128 & ZOJ 1083 Frame Stacking (拓扑排序)
- POJ 1128 Frame Stacking(拓扑排序+DFS)
- POJ 1128 Frame Stacking(拓扑排序+dfs)
- 【poj】1128 Frame Stacking【拓扑排序+输出字典序】
- poj 1128 Frame Stacking(拓扑排序+DFS(递归))
- POJ 1128 Frame Stacking(拓扑排序+dfs)
- poj 1128 Frame Stacking(DFS+拓扑排序)
- POJ: 1128 Frame Stacking (全拓扑序列)
- 了解JavaScript
- Enumeration和Iterator遍历集合类
- 去掉标题栏、信息栏和实现全屏
- IOS 帝国背后的神话故事
- SQLite应用实例
- POJ--1128--Frame Stacking【拓扑排序】
- 《Java并发编程实战》---并发编程带来的风险
- 分解正整数成质因数
- Android自定义控件(二) 下拉刷新,上拉分页加载更多(支持ListView, GridView, ScrollView)
- HDU 2068 RPG的错排 【错排+排列组合】
- nsstring 的一些细节
- node.js学习(2)--路由功能以及表单上传
- HDU 3577 Fast Arrangement(线段树)
- 一个简单的开源PHP爬虫框架『Phpfetcher』