两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一...
POJ1128(ZOJ1083)-Frame Stacking
题意:每个图片由同一字母组成的边框表示,每个图片的字母都不同;
在一个最多30*30的区域放置这些图片,问底层向顶层叠加的图片次序,多选时按字典序输出
注:每个图片的四边都会有字符显示,其中顶点显示两边。
题解:题意的理解是难点,题目对图片的范围确定说得有点含糊不清,博主一开始就被出现的五张图片的样例迷惑,理解重心放错了。题目最需要理解的是下方的三句话。
第一句和数据范围就确定了图片尺寸;
第二句话提示读者应该考虑记录对角线上的两个顶点,以此记录该图片的位置和尺寸;
第三句话确定了图片的数量及可以标明该图片的key值(字母)
最后要注意Input中有多组样例,而Ouput中的多组次序需要按照字典序输出。
理清题意后:接下来的工作就是先用两个顶点确立图片的位置和尺寸;
接着利用各图片的位置和尺寸确定覆盖关系建立单向无环图;
最后利用DFS的回溯完成字典序的拓扑排序即可。
1 //叠图片-拓扑排序+DFS 2 //每个图片由同一字母组成的边框表示,每个图片的字母都不同 3 //在一个最多30*30的区域放置这些图片,问底层向顶层叠加的图片次序,多选时按字典序输出 4 //注:每个图片的四边都至少会有一个字符显示 5 //Time:0Ms Memory:180K 6 #include<iostream> 7 #include<cstring> 8 #include<cstdio> 9 #include<vector> 10 #include<algorithm> 11 using namespace std; 12 13 #define MAXN 31 //地图长宽 14 #define MAXL 26 //字母 15 16 struct Coordinate{ 17 int x, y; 18 }lt[MAXL], rb[MAXL]; //left_top - right_bottom 19 20 struct Letter { 21 vector<int> covered; 22 int in; //in_degree 23 bool exist; 24 }let[MAXL]; 25 26 int row, col; 27 int total; //字母个数 28 char ans[MAXL+1]; 29 char board[MAXN][MAXN]; 30 31 void dfs(int len) 32 { 33 if (len == total) 34 { 35 ans[len] = '