【题目描述】
记者要采访n个人。已知第i个人要回答Ta缺某事物Xi,但如果Ta之前的一个人的答案和Ta一样,Ta就会改口。为了避免受访者改口,记者决定改变采访顺序。
现在给出这n个人的答案,请输出一种可行的方案。要求该方案字典序最小。数据保证有解。
【输入描述】
第一行,一个数n。
接下来的n行,第i+1行为Xi。
【输出描述】
一行,n个数,表示依次访问n个人的顺序。以空格隔开。
【样例输入】
10
1
5
4
1
4
2
1
3
3
5
【样例输出】
1 2 3 4 5 6 7 8 10 9
【数据范围及提示】
0 < n <= 10^4,0 < Xi <=5,数据由随机数产生。
搜索:
源代码: #include<cstdio> #include<cstdlib> int n,i[10001],h[10001],ans[10001]={0}; //建立2个新数组分别来存储解的编号和值,以空间换时间。 bool vis[10001]={0}; void Solve(int t) //DFS确实是做题太少了。 { if (t<=n) for (int a=1;a<=n;a++) //前面还可能有未入队的条件呢。 if (!vis[a]&&i[a]!=ans[t-1]) //未入队且不与解的上一个相同,即符合。 { h[t]=a; ans[t]=i[a]; vis[a]=true; if (t==n) //当符合时,即为字典序最小时。 { for (int a=1;a<=n;a++) printf("%d ",h[a]); exit(0); //直接退出。 } Solve(t+1); vis[a]=false; //回溯。 } } int main() { scanf("%d",&n); for (int a=1;a<=n;a++) scanf("%d",&i[a]); Solve(1); return 0; }
模拟: