zoukankan      html  css  js  c++  java
  • 关于递归

    递归算法的结构大致为

    1 边界条件(就是递归何时结束或得到所要的结果退出)

    2 递归(通过调用自身)

    3 递归的回退

    举例:

    1 n皇后问题

    void queen(int i,int n) //i表示当前层,n表示n皇后
    {
      int j,k;
      if(i==n) //边界条件
      {
        num++;
      }
      for(j=1;j<=n;j++) //将当前皇后逐个放置在不同的列
      {
        for(k=0;k<i;k++) //与前面已放置的皇后判定是否冲突
          if(row[k]==j||abs(k-i)==abs(row[k]-j)) //列和对角线row[k]表示k所在的列
            break;
        if(k==i) //若不冲突
        {
          row[k] = j; //则放置新皇后
          queen(i + 1,n); //在此情况下进行放置下一个皇后
        }
      }
    }

    代码中没有手动回退,是条件不满足是自动结束该层,进入下一层;此问题是遍历所有结果,选择正确答案,超过12就容易超时

    2 九宫格问题

    void backtrace(int counts){
      if(counts == 81){ //边界条件
        for(int i = 0; i < 9; ++i){
          for(int j = 0; j < 9; ++j){
            cout<<maps[i][j]<<" ";
        }
        cout<<endl;
      }
      return ;
    }
      int row = counts / 9;
      int col = counts % 9;
      if(maps[row][col] == 0){
        for(int i = 1; i <= 9; ++i){
          maps[row][col] = i;//赋值
          if(isPlace(counts)){//可以放
            backtrace(counts+1);//进入下一个空位
          }
        }
        maps[row][col] = 0; //当都不满足的时候,退回
      }else{
        backtrace(counts+1);
      }
    }

    此问题只有一个正确解

    装载问题

    void backtrack(int a) //递归遍历所有的组合
    {
      if(a==n) //边界条件
      {
        if(weight>best)
        best=weight;
      }
      if(weight+boxw[a]<=c1) //满足递归条件
      {
        weight=weight+boxw[a];
        backtrack(a+1);
        weight=weight-boxw[a]; //回退,无条件回退,
      }
      backtrack(a+1); //取下一个
    }

    以上递归算法都有共同的框架;

  • 相关阅读:
    P2018 消息传递[dp]
    P1436 棋盘分割[dp]
    一条线段引发的思考
    浅谈树上差分
    P2680 运输计划[二分+LCA+树上差分]
    P1600 天天爱跑步[桶+LCA+树上差分]
    P4560 [IOI2014]Wall 砖墙
    P1311 选择客栈[模拟]
    P1314 聪明的质监员[二分答案]
    Linux snmp导入MIB库
  • 原文地址:https://www.cnblogs.com/zhxuxu/p/8584124.html
Copyright © 2011-2022 走看看