试题
有N个士兵(1≤N≤26),编号依次为A,B,C,…,队列训练时,指挥官要把一些士兵从高到矮一次排成一行,但现在指挥官不能直接获得每个人的身高信息,只能获得“P1比P2高”这样的比较结果(P1、P2∈A,B,C,…,Z,记为 P1>P2),如”A>B”表示A比B高。
请编一程序,根据所得到的比较结果求出一种符合条件的排队方案。
(注:比较结果中没有涉及的士兵不参加排队)
请编一程序,根据所得到的比较结果求出一种符合条件的排队方案。
(注:比较结果中没有涉及的士兵不参加排队)
输入要求
比较结果从文本文件中读入(文件由键盘输入),每个比较结果在文本文件中占一行。
输出要求
若输入数据无解,打印“No Answer!”信息,否则从高到矮一次输出每一个士兵的编号,中间无分割符,并把结果写入文本文件中,文件由键盘输入:
样例输入
A>B
B>D
F>D
B>D
F>D
样例输出
AFBD
#include
#include
#include
#include
using namespace std;
int a[50];
int in[50];
int out[50];
int vis[30];
vector
map[30]; int main() { int n,i,j,k,count=0; char ch1,ch2; memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(vis,0,sizeof(vis)); while (scanf("%c>%c",&ch1,&ch2)!=EOF) { getchar(); i=ch1-'A'; j=ch2-'A'; vis[i]=vis[j]=1; out[i]++; in[j]++; map[i].push_back(j); } n=0; for (i=0;i<26;i++) { if (vis[i]) n++; } queue
que; for (i=0;i<26;i++) { if (vis[i]&&!in[i]) { que.push(i); } } while (!que.empty()) { k=que.front(); que.pop(); a[count++]=k; for (j=0;j