半条命16吧 关注:393贴子:26,041
  • 4回复贴,共1


IP属地:河南1楼2022-01-14 17:01回复

    这是这道题的整体递归搜索过程
    我们使用两个数组,state[]和used[],当这个数字使用过后,就给used[]标为true, state[]的值设置为在这一位置上的具体数字。
    private static int n;
    private static int[] state=new int[10];//0还没放,1~N表示放的具体数字
    private static boolean[] used=new boolean[10];//这个数是否用过
    一开始,先看第一位数,我们可以选定1,然后state[1]=1, used[1]=true。继续往下看,我们有两种选择,我们选择把第二位放上2,同时,state[2]=2, used[2]=true. 第三个位置的数字也同理。这个时候k继续增加,超过了n,触发输出,直接输出这一组数据(根据state[])
    先看第一个数,


    IP属地:河南2楼2022-01-14 17:16
    回复
      for (int i = 1; i <=n ; i++) {
      if(!used[i]){
      state[k]=i;
      used[i]=true;
      dfs(k+1);//每次+1,直到边界然后输出,这个地方往下深挖几层,全局数组state[]会随之改变,直到到达边界然后输出
      state[k]=0;
      used[i]=false;//恢复原状
      }
      }


      IP属地:河南3楼2022-01-14 17:26
      回复
        dltql


        IP属地:河南来自iPhone客户端4楼2022-01-14 20:40
        收起回复