心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
此题有递推的做法,不过我的做法是将记录的信息直接恢复到递归工作栈中。
以下是我的代码:
#include<stdio.h>
#include
<string.h>
#define maxn 10007
long n,m,count,a[maxn],ans[maxn];
bool first,find,used[maxn];
void dfs(long dep)
{
    
if(dep>n)
    {
       first
=false;
       count
++;
       
if(count>m) find=true;
    }
    
for(long i=1;i<=n&&!find;i++)
    {
       
if(first) i=a[dep];
       
if(!used[i])
       {
          used[i]
=true;
          ans[dep]
=i;
          dfs(dep
+1);
          used[i]
=false;
       }
    }
}
int main()
{
    FILE 
*fin,*fout;
    fin
=fopen("martian.in","r");
    fout
=fopen("martian.out","w");
    fscanf(fin,
"%ld%ld",&n,&m);
    
for(long i=1;i<=n;i++) fscanf(fin,"%ld",&a[i]);
    first
=true;find=false;count=0;
    memset(used,
false,sizeof(used));
    dfs(
1);
    
for(long i=1;i<=n;i++)
      fprintf(fout,
"%ld ",ans[i]);
    fprintf(fout,
"\n");
    fclose(fin);
    fclose(fout);
return 0;
}


posted on 2010-03-22 21:39 lee1r 阅读(796) 评论(1)  编辑 收藏 引用 所属分类: 题目分类:数据结构

FeedBack:
# re: NOIP 2004 火星人
2011-11-10 14:27 | fg
fg  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理