首页 > 其他分享 >洛谷火柴人

洛谷火柴人

时间:2024-01-08 14:04:40浏览次数:30  
标签:count 洛谷 第一个 int 位置 static 火柴 手指


洛谷火柴人_i++

洛谷火柴人_数组_02

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Main {
    static int n;
    static int number = 0;
    static int[] arr = new int[20000];
    static boolean[] st = new boolean[20000];
    static int s;
    static int count = 0;
    static boolean judge = true;
    static boolean return0 = false;
    static int[] a = new int[20000];

    public static void main(String[] args) throws Exception {
        Read sc = new Read();
        n = sc.nextInt();
        s = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
        }
        dfs(1);
    }

    public static int dfs(int x) {
        if (return0) {
            return 0;
        }
        if (x > n) {
            count++;
            for (int i = 1; i <= n; i++) {
                if (a[i] != arr[i])
                    judge = false;
            }
            if (judge) {
                number = count;
                judge = false;
            }
            if (count == s + number) {
                return0 = true;
                for (int i = 1; i <= n; i++) {
                    System.out.print(arr[i] + " ");
                }
                System.out.println();
                return 0;
            }
            return 0;
        }
        for (int i = 1; i <= n; i++) {
            if (count == 0) {
                i = a[x];
            }
            if (!st[i]) {
                st[i] = true;
                arr[x] = i;
                dfs(x + 1);
                st[i] = false;
                arr[x] = 0;
            }

        }
        return 0;
    }
}

class Read {
    StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    public int nextInt() throws Exception {
        st.nextToken();
        return (int) st.nval;
    }

    public long nextLong() throws Exception {
        st.nextToken();
        return (long) st.nval;
    }
}

在这段代码中,if(count == 0) i = a[x] 的作用是确保第一个位置上的手指值与输入数组中对应位置的值相匹配。如果我们去掉这段代码,那么第一个位置上的手指值将会根据循环中的变量 i 迭代取值,而不是根据输入数组确定。

假设输入数组 a = {3, 1, 2, 4, 5},如果我们去掉 if(count == 0) i = a[x] 这段代码,那么程序将会按照以下步骤执行:

  1. 第一个位置的手指值 i 可能的取值为 1、2、3、4、5。
  2. 假设首先是 i = 1,在处理第一个位置时,我们将手指值设为 1。
  3. 然后,递归调用 dfs 函数处理下一个位置。此时 count 的值为 1。
  4. 下一个位置的处理仍然会进行循环,手指值的可能取值同样为 1、2、3、4、5。这导致第二个位置上的手指值也有可能为 1。
  5. 然后,递归调用 dfs 函数处理下一个位置。此时 count 的值为 2。
  6. 这样的循环过程会一直进行下去,导致程序生成了错误的手指排列。

而如果我们保留 if(count == 0) i = a[x] 这段代码,将根据输入数组确定第一个位置上的手指值为 3。这样,在递归调用 dfs 函数处理下一个位置时,就不会再出现第一个位置上的手指值为 1 的情况。

这段代码中的 if(count == 0) i = a[x] 只在初始情况下执行一次,目的是将第一个位置上的手指值与输入数组中对应位置的值相匹配。

在回溯算法中,我们通常使用一个计数器(例如 count)来追踪当前处理的手指位置。当 count 的值为 0 时,说明我们正在处理第一个位置上的手指值,此时我们通过 if(count == 0) i = a[x] 将第一个位置上的手指值设定为输入数组中对应位置的值。

在后续的递归调用中,count 的值将不再为 0,因此这段代码将不会再执行,保持当前处理的手指值不变。这样可以确保程序按照正确的顺序生成所有可能的手指排列。

所以,即使 count 只有在初始时为 0,这段代码仍然是必要的,它确保了第一个位置上的手指值正确地与输入数组匹配。

标签:count,洛谷,第一个,int,位置,static,火柴,手指
From: https://blog.51cto.com/u_16426526/9143932

相关文章

  • 【LGR-170-Div.3】洛谷基础赛 #6 & Cfz Round 3 & Caféforces #2
    这套题感觉质量很高A.Battle\[x\equivr(\bmodP)\]\[P\midx-r\]因此只有第一次操作是有效的voidsolve(){ intn,m,p; cin>>n>>m>>p; m-=m%p; if(!m)puts("Alice"); else{ n-=n%p; if(!n)puts("Bob"); else......
  • 洛谷 P5311 [Ynoi2011] 成都七中
    洛谷传送门转化一下题意,变成求\(x\)在只经过编号\(\in[l,r]\)的点,能走到多少种颜色。考虑建出点分树。一个结论是原树上的一个连通块,一定存在一个点,使得它在点分树上的子树完全包含这个连通块的所有点。证明考虑点分治的过程,一个连通块如果没被其中一个点剖开就一定在同一......
  • 洛谷 P9058 [Ynoi2004] rpmtdq
    洛谷传送门类比P9062[Ynoi2002]AdaptiveHsearch&Lsearch处理区间最近点对的思路,尝试只保留可能有贡献的点对。处理树上路径容易想到点分治。设点\(u\)到分治中心的距离为\(a_u\)。我们有\(\text{dis}(u,v)\lea_u+a_v\)。考虑一个点对\((u,v)\)什么时候一定没......
  • 洛谷B3611 【模板】传递闭包 floyd/bitset
    目录floydbitset优化题目链接:https://www.luogu.com.cn/problem/B3611参考题解:https://www.luogu.com.cn/blog/53022/solution-b3611floyd#include<bits/stdc++.h>usingnamespacestd;constintmaxn=101;intn,f[maxn][maxn];intmain(){scanf("%d"......
  • 洛谷B3647 【模板】Floyd 题解 floyd算法 求 多源多汇最短路
    题目链接:https://www.luogu.com.cn/problem/B3647floyd算法:https://oi-wiki.org/graph/shortest-path/#floyd-算法示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=101;intn,m,f[maxn][maxn];intmain(){scanf("%d%d",&n......
  • 【题解】洛谷P1496 火烧赤壁 (离散化)
    P1496火烧赤壁-洛谷|计算机科学教育新生态(luogu.com.cn)我们首先先看数据,n<=20000,数据不多,但是范围大(-10^9<=Ai,Bi<=10^9),这时,就可以用离散化了。但是在这里我们会遇到区间重合的问题(也可以使用区间合并),如下图本题的题意是让我们求出燃烧位置的长度之和。区间重合时只......
  • 【题解】洛谷P1068 [NOIP2009 普及组] 分数线划定 (map)
    ##题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的$150\%$划定,即如果计划录取$m$名志愿者,则面试分数线为排名第$m\times150\%$(向......
  • 洛谷 P1229
    题目链接有4种结构。对于只有一个儿子(度为1)的结点,其子节点在左/右不影响先序/后序的遍历顺序,总树数*2。即每多一个度为1的结点,二叉树数量翻倍。即当先根序列为\(.....XY.....,\)后根序列为\(.........YX...\)时翻倍。求出这种结构的个数即可。#include<bits/stdc++.h>usi......
  • 【洛谷 P1781】宇宙总统 题解(高精度+结构体排序)
    宇宙总统题目描述地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。输入格式第一行为一个整数,代表竞选总统的人数。接下来有行,分别为第一个候选人到第个候选人的票数。输出格式共两行,第一行是......
  • 【洛谷 P1093】[NOIP2007 普及组] 奖学金 题解(结构体排序)
    [NOIP2007普及组]奖学金题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前名学生发奖学金。期末,每个学生都有门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规......