• 递归DFS中不该变的量,无意中变了!!


    题目:HDU 2464 A Pair of Graph 

    代码:

    View Code
    #include <stdio.h>
    #include <string.h>

    int A[10][10],B[10][10];
    int vary[10];
    bool flag[10];

    int small1,small2,min;

    void action(int n)
    {
    int i,j,val=0;

    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
    {
    if(A[vary[i]][vary[j]]==B[i][j]) continue;
    if(A[vary[i]][vary[j]])
    val+=small2;
    else
    val+=small1;
    }
    }
    if(val<min) min=val;
    }

    void DFS(int pos,int n)
    {
    int i;
    if(pos==n) {action(n); return ; }

    for(i=0;i<n;i++)
    {
    if(flag[i])
    {
    vary[pos]=i;
    flag[i]=false;
    DFS(pos+1,n);
    // 原来->DFS(++pos,n);考,给力!递归中pos的值再回溯时,pos的值就变了...
    // 狂汗!!
    flag[i]=true;
    }
    }
    }

    void solve()
    {
    int n,Ma,Mb,Ia,Ib,Da,Db;
    int i,a,b,cas=0;

    while(scanf("%d %d %d",&n,&Ma,&Mb) && n)
    {
    scanf("%d %d %d %d",&Ia,&Ib,&Da,&Db);
    small1=(Ia<Db?Ia:Db);
    small2=(Ib<Da?Ib:Da);
    min=0xfffffff;

    memset(A,0,sizeof(A));
    memset(B,0,sizeof(B));
    for(i=0;i<Ma;i++)
    {
    scanf("%d %d",&a,&b);
    A[a][b]=A[b][a]=1;
    }
    for(i=0;i<Mb;i++)
    {
    scanf("%d %d",&a,&b);
    B[a][b]=B[b][a]=1;
    }
    scanf("\n");
    for(i=0;i<n;i++) flag[i]=true;

    DFS(0,n);

    printf("Case #%d: %d\n",++cas,min/2);
    }
    }

    int main()
    {
    solve();
    return 0;
    }

    我要记录这一刻:

    View Code
    void DFS(int pos,int n)
    {
    int i;
    if(pos==n) {action(n); return ; }

    for(i=0;i<n;i++)
    {
    if(flag[i])
    {
    vary[pos]=i;
    flag[i]=false;
    DFS(++pos,n); //!!!!!!
    flag[i]=true;
    }
    }
    }

    这个错了,又是找了很长时间!汗死!!!

    代码中 DFS(++pos,n); 当回溯是pos的值就变了不是原来的位置了,当然错了!!!


    启发:写递归是要特别注意,不变的量,一定不要进行自加操作!!不是特意的就尽量不要用++!!

  • 相关阅读:
    项目架构开发:数据访问层之Cache
    微信公众号平台接口开发:菜单管理
    【软件工程】第0次个人作业
    OO第四次博客作业
    OO第三次博客作业
    OO第二次博客作业
    Java学习笔记
    SQLInjection 靶场配置
    OO第一次博客作业
    面向对象先修:Java入门
  • 原文地址:https://www.cnblogs.com/fornever/p/2240196.html
Copyright © 2020-2023  润新知