您的位置:首页 > 其它

POJ 1128 Frame Stacking 拓扑排序+暴搜

2016-07-27 20:50 441 查看
这道题输出特别坑。。。。

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

就解释一下输出吧。。

它让你 从下往上输出。

如果有多种情况,按照字典序从小往大输出。。。

就是这个多种情况是怎么产生的呢。

下面给一组样例。



很明显 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 <cstdio>
#include <cstring>
#include <algorithm>
#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了一屏,,,,,,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj