你缺什么

【题目描述】

记者要采访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;
}

模拟:

posted @ 2016-06-10 17:55  前前前世。  阅读(169)  评论(0编辑  收藏  举报