看到題應該很容易想到利用拓撲排序來判斷相框之間的關係,對於每乙個相框,我們遍歷一遍可以找到他的 上下左右 四條邊的位置,再搜尋這幾條邊上是否有其他字母,有的話就新增乙個類似於a然後就是我個人認為的這道題的難點,怎麼按照字典序輸出所有可能答案,
最開始我想的是利用bfs跑拓撲,確定每個點的層級,再對相同層級的點利用next_permutationh函式進行排列,最後發現可能出現乙個點屬於多個層級的情況,如下圖
此時是無法確定d的層級的
對這道題的正確處理應該是利用dfs來跑拓撲,並記錄深度和答案,
當深度等於相框數量時 輸出答案 否則將當前節點指向的所有點的度減少1,並再次進行拓撲排序,在呼叫結束後還需要回溯,將所有減去的點的度加回去,這樣就可以輸出所有的正確答案
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#define int long long
using
namespace std;
typedef
long
long ll;
const
int maxn=
2e5+50;
const
int inf=
0x3f3f3f3f
;const
int mod=
1e9+7;
const
int hash=
131;
string s[40]
;vector<
int> v[30]
;int degree[30]
=;int vis[30]
=;int h,w,n;
int cnt[30]
=;void
init()
}char ans[30]
;void
topsort
(int tmp,
int depth)
cnt[tmp]++;
for(
int i=
0;i.size()
;i++
)for
(int i=
0;i<
26;i++)if
(vis[i]
&°ree[i]==0
&&!cnt[i]
)topsort
(i,depth+1)
;for
(int i=
0;i.size()
;i++
) cnt[tmp]--;
}int
main()
}}if(shang!=
100) vis[num]=1
;for
(int i=zuo;i<=you;i++)if
(s[xia]
[i]!=id)
}for
(int i=shang;i<=xia;i++)if
(s[i]
[you]
!=id)}}
for(
int i=
0;i<
26;i++)if
(vis[i]
) n++
; ans[n]
='\0'
;for
(int i=
0;i<
26;i++)}
return0;
}
POJ 1128 DAG拓撲排序
題目鏈結poj1128 給定一張邊框覆蓋圖,求邊框從上到下的關係 如果在a的邊框上出現了字母b,就說明b在a的上方 如果邊框a在邊框b的下方,就新增從a到b的一條有向邊 題目要求從下到上輸出 那麼所求的是所得有向無環圖的拓撲排序 題目還要求按照字典序輸出所有可能的順序,用深度優先搜尋 include...
POJ1270 拓撲排序 DFS
題意 先給你乙個字串,讓你給他們排序 再給你一行,在這一行,每兩個就是第乙個需要在第二個前面 思路 dfs寫多了感覺好有啊,就是排序過程中可能會有多種情況。我們考慮一下怎麼排好乙個位置,這個位置可能有多個東西可以佔,那麼這些東西對於這個位置都是等價的,那麼我們可以採用深搜下 回溯來解決。其實還是蠻簡...
POJ1270 拓撲排序 DFS
題意 先給你乙個字串,讓你給他們排序 再給你一行,在這一行,每兩個就是第乙個需要在第二個前面 思路 dfs寫多了感覺好有啊,就是排序過程中可能會有多種情況。我們考慮一下怎麼排好乙個位置,這個位置可能有多個東西可以佔,那麼這些東西對於這個位置都是等價的,那麼我們可以採用深搜下 回溯來解決。其實還是蠻簡...