# 題目: UVa 872 - Ordering

# 題目說明

題目給數個字母及排列順序
求所有的可能排序


INPUT:
第一行有一個整數 T ,代表有 T 筆測資
接著有兩行字串,第一行為所有的字母,第二行為這些字母的排列順序
每個字母間以空格隔開


OUTPUT:
輸出所有可能的字母排序

# 解題方法

以字串儲存字母並排序
接著跑 dfs ,判斷字母是否有跑過、是否符合規則,都是則繼續跑下一層 dfs

# 參考程式碼

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <memory.h>
using namespace std;
bool graph[26][26];
bool check[26];
bool t;
string sdata;
void dfs(string s)
{
	if (s.size() == sdata.size()) {
		for (int i = 0; i < s.size(); ++i)
			cout << s[i] << (i != s.size() - 1 ? " " : "\n");
		t = true;
		return;
	}
	for (size_t i = 0; i < sdata.size(); ++i)
		if (!check[sdata[i] - 'A']) {
		
			int j = 0;
			for (; j < s.size(); ++j)
				if (graph[sdata[i] - 'A'][s[j] - 'A']) break;
			if (j == s.size()) {
				check[sdata[i] - 'A'] = true;
				dfs(s + sdata[i]);
				check[sdata[i] - 'A'] = false;
			}
		}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int T;
	string str;
	cin >> T;
	cin.ignore();
	while (T--) {
		getline(cin, str);
		sdata.clear();
		t = false;
		memset(graph, false, sizeof(graph));
		memset(check, false, sizeof(check));
		getline(cin, str);
		stringstream ss;
		ss << str;
		while (ss >> str) sdata += str;
		sort(sdata.begin(), sdata.end());
		getline(cin, str);
		ss.clear();
		ss << str;
		while (ss >> str) graph[str[0] - 'A'][str[2] - 'A'] = true;
		dfs("");
		if (!t) cout << "NO\n";
		if (T) cout << "\n";
	}
	return 0;
}

# 參考資料

https://www.larrysprognotes.com/UVa%20-%20872/