博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1128 Frame Stacking 拓扑排序+暴搜
阅读量:5011 次
发布时间:2019-06-12

本文共 2645 字,大约阅读时间需要 8 分钟。

这道题输出特别坑。。。。

题目的意思也不太好理解。。

就解释一下输出吧。。

它让你 从下往上输出。
如果有多种情况,按照字典序从小往大输出。。。
就是这个多种情况是怎么产生的呢。
下面给一组样例。
这里写图片描述
很明显 A在最底下且A在Z下,Y和这个连通块 没有相交。
答案是:
AYZ
AZY
YAZ

所以题目的意思是让你输出可能的方案。 并不管它是在第几层上。

前几次WA的原因:没有考虑多种情况

后几次WA的原因:把这个块分层以后按照层排好序以后next_permutation
现在看看真是被我自己蠢哭了、、、

最后附一个无解数据吧(把所有结果输出就会超时)

(但是测试数据里没有这样的数据):
15
18
AAABBBCCCDDDEEEFFF
A.AB.BC.CD.DE.EF.F
AAABBBCCCDDDEEEFFF
GGGHHHIIIJJJKKKLLL
G.GH.HI.IJ.JK.KL.L
GGGHHHIIIJJJKKKLLL
MMMNNNOOOPPPQQQRRR
M.MN.NO.OP.PQ.QR.R
MMMNNNOOOPPPQQQRRR
SSSTTTUUUVVVWWWXXX
S.ST.TU.UV.VW.WX.X
SSSTTTUUUVVVWWWXXX
YYYZZZ…………
Y.YZ.Z…………
YYYZZZ…………

// by SiriusRen#include 
#include
#include
#define mem(ARRAY,NUM) memset(ARRAY,NUM,sizeof(ARRAY))using namespace std;int n,m,tot,N;char a[30][30],s[30],lm[30],lx[30],rm[30],rx[30],in[30],v[999];int first[30],next[999];bool vis[30],map[30][30],VIS[30];void add(char x,char y){v[tot]=y;next[tot]=first[x];first[x]=tot++;}void dfs(int t){ if(t==N+1){ for(char i=1;i<=N;i++)printf("%c",s[i]+'A');putchar('\n'); } for(char i=0;i<26;i++) if(!in[i]&&vis[i]&&!VIS[i]){ VIS[i]=1,s[t]=i; for(char j=first[i];~j;j=next[j])in[v[j]]--; dfs(t+1); for(char j=first[i];~j;j=next[j])in[v[j]]++; VIS[i]=0; }}int main(){ while(~scanf("%d%d",&n,&m)){ mem(lm,0x3f);mem(rm,0x3f);mem(first,-1);tot=N=0; mem(lx,0);mem(rx,0),mem(map,0);mem(vis,0);mem(in,0); for(char i=1;i<=n;i++) for(char j=0;j<=m;j++){ scanf("%c",&a[i][j]); if(a[i][j]!='.'&&a[i][j]!='\n'){ a[i][j]-='A'; if(!vis[a[i][j]])vis[a[i][j]]=1,N++; lm[a[i][j]]=min(lm[a[i][j]],j); rm[a[i][j]]=min(rm[a[i][j]],i); lx[a[i][j]]=max(lx[a[i][j]],j); rx[a[i][j]]=max(rx[a[i][j]],i); } } for(char i=0;i<26;i++) if(vis[i]){ for(char j=lm[i];j<=lx[i];j++){ if(a[rm[i]][j]!=i&&!map[a[rm[i]][j]][i])map[a[rm[i]][j]][i]=1; if(a[rx[i]][j]!=i&&!map[a[rx[i]][j]][i])map[a[rx[i]][j]][i]=1; } for(char j=rm[i];j<=rx[i];j++){ if(a[j][lm[i]]!=i&&!map[a[j][lm[i]]][i])map[a[j][lm[i]]][i]=1; if(a[j][lx[i]]!=i&&!map[a[j][lx[i]]][i])map[a[j][lx[i]]][i]=1; } } for(char i=0;i<26;i++) for(char j=0;j<26;j++) if(map[i][j])add(j,i),in[i]++; dfs(1); }}

这里写图片描述

成功WA了一屏,,,,,,

转载于:https://www.cnblogs.com/SiriusRen/p/6532380.html

你可能感兴趣的文章
团队个人冲刺第三天
查看>>
unit
查看>>
2017-10-17 NOIP模拟赛2
查看>>
How to install ia32-libs in Ubuntu 14.04 LTS (Trusty Tahr)
查看>>
ACM/ICPC 之 模拟 (HNUOJ 13391-换瓶模拟)
查看>>
JavaWeb学习——JSP基础
查看>>
Eclipse tomcat server 无法添加项目
查看>>
黑寡妇黄飞鸿
查看>>
leetcode 217 Contains Duplicate 数组中是否有重复的数字
查看>>
The Ctrl & CapsLock `problem'
查看>>
MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
查看>>
linux故障判断
查看>>
Leetcode 23. Merge k Sorted Lists(python)
查看>>
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>
face detection[HR]
查看>>
java性能调优工具
查看>>
C# 其他的Url 文件的路径转化为二进制流
查看>>
cmake使用
查看>>
ios7上隐藏status bar
查看>>