<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Jia Zhang</title>
      <link>https://jiaz.dev</link>
      <description>Software Engineer. Systems &amp; Performance.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://jiaz.dev/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 24 Oct 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>二分问题的统一解决方案</title>
          <pubDate>Wed, 03 Apr 2024 00:00:00 +0000</pubDate>
          <author>Jia Zhang</author>
          <link>https://jiaz.dev/blog/binary-search-framework/</link>
          <guid>https://jiaz.dev/blog/binary-search-framework/</guid>
          <description xml:base="https://jiaz.dev/blog/binary-search-framework/">&lt;p&gt;思路来自灵茶山艾府的视频《&lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/watch?v=QvcM99na30k&quot;&gt;基础算法精讲 04&lt;/a&gt;》。本文是学习记录，结合了我自己的思考，修改后得出这个框架。&lt;/p&gt;
&lt;h2 id=&quot;yin-ru&quot;&gt;引入&lt;a class=&quot;anchor&quot; href=&quot;#yin-ru&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;在算法题中有时会遇到这种场景：一个问题的答案是一个整数，且一定落在某个范围内，例如只可能是 $[1, 10^9]$ 中的一个数。并且存在一个条件，对于任何小于答案的数，这个条件都不成立；对于任何大于等于答案的数，这个条件都成立。这时就可以用二分的方法来找到答案。&lt;/p&gt;
&lt;h2 id=&quot;kuang-jia-yu-qiu-jie&quot;&gt;框架与求解&lt;a class=&quot;anchor&quot; href=&quot;#kuang-jia-yu-qiu-jie&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;下面用严格的语言来表达这类问题（我称为二分问题）。&lt;/p&gt;
&lt;p&gt;存在一个函数 &lt;code&gt;check&lt;/code&gt;，它接受一个整数 &lt;code&gt;i&lt;/code&gt; 作为输入，&lt;code&gt;check(i)&lt;/code&gt; 只可能等于 &lt;code&gt;True&lt;/code&gt; 或 &lt;code&gt;False&lt;/code&gt;。并且存在一个数 $k$，使得对于任何小于 $k$ 的整数 &lt;code&gt;i&lt;/code&gt;，都有 &lt;code&gt;check(i) == False&lt;/code&gt;；而对于任何大于等于 $k$ 的整数 &lt;code&gt;i&lt;/code&gt;，都有 &lt;code&gt;check(i) == True&lt;/code&gt;。我们现在有函数 &lt;code&gt;check&lt;/code&gt;，需要找到这个整数 $k$，并且知道 $k$ 在 $[a, b]$ 区间内。&lt;/p&gt;
&lt;p&gt;接下来提出一个框架来解决这个问题。&lt;/p&gt;
&lt;p&gt;首先，从获取信息的角度来思考。在实际跑一次 &lt;code&gt;check&lt;/code&gt; 之前，我们没有获取任何信息，这时可以认为 $[a, b]$ 之间的所有整数都处于&lt;strong&gt;未知&lt;/strong&gt;状态。&lt;/p&gt;
&lt;p&gt;而运行了 &lt;code&gt;check(i)&lt;/code&gt; 之后，由于问题的性质，我们获取到的信息不只是 &lt;code&gt;check(i)&lt;/code&gt; 本身的真假，而是一整个范围内的整数满足或者不满足条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 &lt;code&gt;check(i) == False&lt;/code&gt;，那么 $[a, i]$ 闭区间内所有整数的 &lt;code&gt;check&lt;/code&gt; 结果一定也都是 &lt;code&gt;False&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;check(i) == True&lt;/code&gt;，那么 $[i, b]$ 闭区间内所有整数的 &lt;code&gt;check&lt;/code&gt; 结果一定也都是 &lt;code&gt;True&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;定义闭区间 $[l, r]$ 为&lt;strong&gt;求解区间&lt;/strong&gt;，它满足以下三条性质：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;$[l, r]$ 中全是我们还&lt;strong&gt;不知道&lt;/strong&gt; &lt;code&gt;check&lt;/code&gt; 结果的整数；&lt;/li&gt;
&lt;li&gt;对于任何大于 $r$ 的整数，&lt;code&gt;check&lt;/code&gt; 的结果一定是 &lt;code&gt;True&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;对于任何小于 $l$ 的整数，&lt;code&gt;check&lt;/code&gt; 的结果一定是 &lt;code&gt;False&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一开始 $[a, b]$ 中全是未知的，所以把求解区间初始化为 $[a, b]$，也就是定义两个变量 &lt;code&gt;l&lt;/code&gt;、&lt;code&gt;r&lt;/code&gt;，令 &lt;code&gt;l &amp;lt;- a, r &amp;lt;- b&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;然后取求解区间的中点 &lt;code&gt;mid &amp;lt;- l + (r - l) / 2&lt;/code&gt;，计算 &lt;code&gt;check(mid)&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 &lt;code&gt;check(mid) == True&lt;/code&gt;，说明 $[mid, r]$ 都是 &lt;code&gt;True&lt;/code&gt;，这一段从&lt;strong&gt;未知&lt;/strong&gt;变为&lt;strong&gt;已知&lt;/strong&gt;，因此令 &lt;code&gt;r &amp;lt;- mid - 1&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;check(mid) == False&lt;/code&gt;，说明 $[l, mid]$ 都是 &lt;code&gt;False&lt;/code&gt;，这一段从&lt;strong&gt;未知&lt;/strong&gt;变为&lt;strong&gt;已知&lt;/strong&gt;，因此令 &lt;code&gt;l &amp;lt;- mid + 1&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这两种操作都保持了上面三条性质始终成立。然后重复取中点和上述操作，直到 $r &amp;lt; l$ 为止。此时求解区间为空，也就是&lt;strong&gt;未知&lt;/strong&gt;的部分为空，$[a, b]$ 内每一个整数的 &lt;code&gt;check&lt;/code&gt; 结果都已经知道了。我们的目标就是：在三条性质始终成立的前提下，把未知区间变为空。&lt;/p&gt;
&lt;p&gt;未知区间为空之后，$r$ 一定等于 $l - 1$。此时 &lt;code&gt;r&lt;/code&gt; 就是最后一个 &lt;code&gt;False&lt;/code&gt; 所在的位置，&lt;code&gt;l&lt;/code&gt; 就是第一个 &lt;code&gt;True&lt;/code&gt; 所在的位置，题目要哪一个就返回哪一个。&lt;/p&gt;
&lt;p&gt;写成 C++ 就是：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 返回 [a, b] 中第一个使 check 为 true 的整数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; first_true&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; auto&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; check&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; l&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 求解区间 [l, r]：里面全是未知的&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;          //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 求解区间非空&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; l&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; l&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;mid&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;            r&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; [mid, r] 都是 true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;            l&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; [l, mid] 都是 false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; l&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 此时 r == l - 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ju-li-shuo-ming-ke-yi-xian-kan-zhe-ge-bu-fen&quot;&gt;举例说明（可以先看这个部分）&lt;a class=&quot;anchor&quot; href=&quot;#ju-li-shuo-ming-ke-yi-xian-kan-zhe-ge-bu-fen&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;假设把 &lt;code&gt;check&lt;/code&gt; 应用在下标 0 到 8 上，得到的结果分别是&lt;/p&gt;
&lt;p&gt;$$[F, F, F, F, T, T, T, T, T]$$&lt;/p&gt;
&lt;p&gt;那么取 &lt;code&gt;l &amp;lt;- 0, r &amp;lt;- 8&lt;/code&gt;，计算得到 &lt;code&gt;mid &amp;lt;- 4&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;此时 &lt;code&gt;check(4) == T&lt;/code&gt;，说明 $[4, 8]$ 区间内的每一个整数都是 &lt;code&gt;T&lt;/code&gt;，它们从&lt;strong&gt;未知&lt;/strong&gt;变成&lt;strong&gt;已知&lt;/strong&gt;。执行 &lt;code&gt;r &amp;lt;- mid - 1&lt;/code&gt;，得到新的未知区间 &lt;code&gt;[l, r] == [0, 3]&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;计算 &lt;code&gt;mid &amp;lt;- l + (r - l) / 2&lt;/code&gt;，得到新的 &lt;code&gt;mid == 1&lt;/code&gt;。此时 &lt;code&gt;check(1) == F&lt;/code&gt;，说明 $[0, 1]$ 区间均为 &lt;code&gt;F&lt;/code&gt;。执行 &lt;code&gt;l &amp;lt;- mid + 1&lt;/code&gt;，新的未知区间为 &lt;code&gt;[l, r] == [2, 3]&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;计算得到新的 &lt;code&gt;mid == 2&lt;/code&gt;。此时 &lt;code&gt;check(2) == F&lt;/code&gt;，说明 $[0, 2]$ 区间均为 &lt;code&gt;F&lt;/code&gt;。执行 &lt;code&gt;l &amp;lt;- mid + 1&lt;/code&gt;，新的未知区间为 &lt;code&gt;[l, r] == [3, 3]&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;计算得到新的 &lt;code&gt;mid == 3&lt;/code&gt;。此时 &lt;code&gt;check(3) == F&lt;/code&gt;，说明 $[0, 3]$ 区间均为 &lt;code&gt;F&lt;/code&gt;。执行 &lt;code&gt;l &amp;lt;- mid + 1&lt;/code&gt;，新的未知区间为 &lt;code&gt;[l, r] == [4, 3]&lt;/code&gt;，即空区间。&lt;/p&gt;
&lt;p&gt;计算结束。此时 &lt;code&gt;l == 4, r == 3&lt;/code&gt;：&lt;code&gt;l&lt;/code&gt; 就是第一个 &lt;code&gt;T&lt;/code&gt; 所在的位置，&lt;code&gt;r&lt;/code&gt; 就是最后一个 &lt;code&gt;F&lt;/code&gt; 所在的位置。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;2026 年 10 月修订。&lt;/em&gt; 修正了例子里的笔误：原文把更新写成了 &lt;code&gt;mid &amp;lt;- (r - 1)&lt;/code&gt; 和 &lt;code&gt;mid &amp;lt;- (l + 1)&lt;/code&gt;，应为 &lt;code&gt;r &amp;lt;- mid - 1&lt;/code&gt; 和 &lt;code&gt;l &amp;lt;- mid + 1&lt;/code&gt;；原文说把 &lt;code&gt;check&lt;/code&gt; 应用在 1 到 9 上，却又从 &lt;code&gt;l &amp;lt;- 0, r &amp;lt;- 8&lt;/code&gt; 开始，现统一为下标 0 到 8。补充了与文字描述一一对应的 C++ 代码（需要 C++20 才能用 &lt;code&gt;auto&lt;/code&gt; 形参）。注意 &lt;code&gt;l&lt;/code&gt;、&lt;code&gt;r&lt;/code&gt; 要用有符号整数：当 $a = 0$ 且 &lt;code&gt;check(0)&lt;/code&gt; 为真时，&lt;code&gt;r&lt;/code&gt; 会变成 $-1$，无符号类型会在这里回绕。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Value Categories in C++</title>
          <pubDate>Tue, 23 Aug 2022 00:00:00 +0000</pubDate>
          <author>Jia Zhang</author>
          <link>https://jiaz.dev/blog/value-categories-in-cpp/</link>
          <guid>https://jiaz.dev/blog/value-categories-in-cpp/</guid>
          <description xml:base="https://jiaz.dev/blog/value-categories-in-cpp/">&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;a class=&quot;anchor&quot; href=&quot;#intro&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;type_traits&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; IS_XVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;is_rvalue_reference&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;decltype&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; IS_PRVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;is_reference&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;decltype&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; IS_LVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;is_lvalue_reference&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;decltype&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a method I recently discovered to determine the value category of an &lt;strong&gt;expression&lt;/strong&gt;. I’ll explain why it works later.&lt;/p&gt;
&lt;p&gt;First, let’s take a look at value categories in C++.&lt;/p&gt;
&lt;p&gt;The most important thing to notice before we start is that value categories are not a property of &lt;strong&gt;values&lt;/strong&gt; but a property of &lt;strong&gt;expressions&lt;/strong&gt;. Much depends on what you take &lt;em&gt;value&lt;/em&gt; to mean: I looked through the C++ standard, and it does not seem to define the term itself. We all know what an expression is, though (if not, see &lt;a rel=&quot;external&quot; href=&quot;https://en.cppreference.com/cpp/language/expressions&quot;&gt;cppreference&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Every expression belongs to exactly one of three primary value categories: &lt;strong&gt;lvalue&lt;/strong&gt;, &lt;strong&gt;prvalue&lt;/strong&gt; and &lt;strong&gt;xvalue&lt;/strong&gt;. (Two more names group them: a &lt;em&gt;glvalue&lt;/em&gt; is an lvalue or an xvalue, and an &lt;em&gt;rvalue&lt;/em&gt; is a prvalue or an xvalue.)&lt;/p&gt;
&lt;p&gt;We know you can write &lt;code&gt;x = 3&lt;/code&gt; but not &lt;code&gt;3 = x&lt;/code&gt;. Both &lt;code&gt;3&lt;/code&gt; and &lt;code&gt;x&lt;/code&gt; are expressions, so there must be some qualitative difference between them. Since &lt;code&gt;x&lt;/code&gt; can appear on the left of the assignment sign, we call it an lvalue; &lt;code&gt;3&lt;/code&gt; is accordingly called an rvalue.&lt;/p&gt;
&lt;p&gt;OK, that is the difference between lvalues and rvalues. But what are prvalues and xvalues?&lt;/p&gt;
&lt;p&gt;There are two dimensions to an expression: 1. Does it have an identity? 2. Can it be moved from?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An expression that has identity and can be moved from is an &lt;strong&gt;xvalue&lt;/strong&gt; (“eXpiring value”).&lt;/li&gt;
&lt;li&gt;One that has identity but cannot be moved from is an &lt;strong&gt;lvalue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;One that has no identity but can be moved from is a &lt;strong&gt;prvalue&lt;/strong&gt; (“pure rvalue”).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, these are xvalues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;std::move(x)&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a.m&lt;/code&gt;, a member of an object expression, where &lt;code&gt;a&lt;/code&gt; is an rvalue and &lt;code&gt;m&lt;/code&gt; is a non-static data member of non-reference type.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;temporary-materialization&quot;&gt;Temporary materialization&lt;a class=&quot;anchor&quot; href=&quot;#temporary-materialization&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The most useful example for understanding xvalues is temporary materialization:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt; S&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; S&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; member access expects a glvalue as of C++17;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;               //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; the prvalue S() is converted to an xvalue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As &lt;a rel=&quot;external&quot; href=&quot;https://en.cppreference.com/cpp/language/implicit_conversion#Temporary_materialization&quot;&gt;cppreference&lt;/a&gt; puts it: a prvalue of any complete type &lt;code&gt;T&lt;/code&gt; can be converted to an xvalue of the same type &lt;code&gt;T&lt;/code&gt;. This conversion initializes a temporary object of type &lt;code&gt;T&lt;/code&gt; from the prvalue by evaluating the prvalue with the temporary object as its result object, and produces an xvalue denoting the temporary object. If &lt;code&gt;T&lt;/code&gt; is a class or array of class type, it must have an accessible and non-deleted destructor.&lt;/p&gt;
&lt;p&gt;So the key difference between an xvalue and a prvalue is that an xvalue refers to an object that already exists, one whose resources we are allowed to &lt;strong&gt;reuse&lt;/strong&gt;, while a prvalue is just a recipe for a value until it initializes something. There is nothing to reuse in the number 3 or 3.7, but &lt;strong&gt;we can reuse the memory allocated by a temporary &lt;code&gt;std::string&lt;/code&gt;&lt;/strong&gt;, and that temporary becomes an object (an xvalue) the moment we need one.&lt;/p&gt;
&lt;h2 id=&quot;decltype-and-value-categories&quot;&gt;decltype and value categories&lt;a class=&quot;anchor&quot; href=&quot;#decltype-and-value-categories&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;decltype&lt;/code&gt; is a good tool for determining the category of an expression, because for an expression of type &lt;code&gt;T&lt;/code&gt; it yields an rvalue reference &lt;code&gt;T&amp;amp;&amp;amp;&lt;/code&gt; for an xvalue, the plain type &lt;code&gt;T&lt;/code&gt; for a prvalue, and an lvalue reference &lt;code&gt;T&amp;amp;&lt;/code&gt; for an lvalue.&lt;/p&gt;
&lt;p&gt;Someone may object: with &lt;code&gt;int x = 3;&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt; is an lvalue, yet &lt;code&gt;decltype(x)&lt;/code&gt; is &lt;code&gt;int&lt;/code&gt; rather than &lt;code&gt;int&amp;amp;&lt;/code&gt;. That is the special case for id-expressions in the behaviour of &lt;a rel=&quot;external&quot; href=&quot;https://en.cppreference.com/cpp/language/decltype&quot;&gt;&lt;code&gt;decltype&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the argument is an unparenthesized id-expression or an unparenthesized class member access expression, then decltype yields the type of the entity named by this expression. If there is no such entity, or if the argument names a set of overloaded functions, the program is ill-formed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So the right way is &lt;code&gt;int x = 3; decltype((x)) xref = x;&lt;/code&gt;. Here the type of &lt;code&gt;xref&lt;/code&gt; is &lt;code&gt;int&amp;amp;&lt;/code&gt;. That is why the macros above wrap &lt;code&gt;expr&lt;/code&gt; in an extra pair of parentheses: it turns every id-expression into an ordinary expression, and &lt;code&gt;decltype&lt;/code&gt; then reports its value category.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;utility&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt; S&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    static_assert&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;IS_LVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    static_assert&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;IS_LVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;                //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; string literals are lvalues&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    static_assert&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;IS_PRVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    static_assert&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;IS_PRVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    static_assert&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;IS_PRVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;hi&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    static_assert&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;IS_XVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    static_assert&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;IS_XVALUE&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;std-move&quot;&gt;std::move&lt;a class=&quot;anchor&quot; href=&quot;#std-move&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The famous function &lt;code&gt;std::move&lt;/code&gt; has nothing to do with actually moving something. All it does is turn its argument into an xvalue; usually you call it on an lvalue.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;std::move&lt;/code&gt; is used to &lt;strong&gt;indicate&lt;/strong&gt; that an object &lt;code&gt;t&lt;/code&gt; may be “moved from”, i.e. to allow the efficient transfer of resources from &lt;code&gt;t&lt;/code&gt; to another object. In particular, &lt;code&gt;std::move&lt;/code&gt; produces an xvalue expression that identifies its argument &lt;code&gt;t&lt;/code&gt;. It is exactly equivalent to &lt;code&gt;static_cast&amp;lt;std::remove_reference_t&amp;lt;T&amp;gt;&amp;amp;&amp;amp;&amp;gt;(t)&lt;/code&gt; (&lt;a rel=&quot;external&quot; href=&quot;https://en.cppreference.com/cpp/utility/move&quot;&gt;cppreference&lt;/a&gt;).&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Revised in October 2026.&lt;/em&gt; The macros now spell out &lt;code&gt;std::&lt;/code&gt; and the header they need, and a small test program has been added; it compiles with GCC and Clang in C++17 mode. The prvalue/xvalue comparison was sharpened: since C++17 a prvalue is not an object until it is materialized, so what tells the two apart is whether an object already exists, not whether it can be moved from. Links point to the current cppreference URLs.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Using C++17 or Later with the clangd Extension in VS Code</title>
          <pubDate>Sun, 07 Aug 2022 00:00:00 +0000</pubDate>
          <author>Jia Zhang</author>
          <link>https://jiaz.dev/blog/clangd-cpp-standard/</link>
          <guid>https://jiaz.dev/blog/clangd-cpp-standard/</guid>
          <description xml:base="https://jiaz.dev/blog/clangd-cpp-standard/">&lt;p&gt;Recently I switched my code completion tool in VS Code from Microsoft’s official C/C++ extension to clangd. On the one hand, clangd gives a better experience; on the other hand, it is also what I use at my company (ByteDance).&lt;/p&gt;
&lt;p&gt;I joked to myself that the two most interesting things I learned during my internship were that indentation went from four spaces to two, and that opening braces stopped getting a line of their own.&lt;/p&gt;
&lt;p&gt;Now, there was a problem. I installed clangd, switched over, and everything worked fine, until I used &lt;code&gt;std::string_view&lt;/code&gt; and clangd told me it didn’t recognize it. I quickly realized that clangd’s default C++ standard was still C++14, so changing that default became something I had to do.&lt;/p&gt;
&lt;p&gt;I googled but didn’t find anything useful.&lt;/p&gt;
&lt;p&gt;I tried a &lt;code&gt;compile_commands.json&lt;/code&gt; file. But on the one hand, it has to be set up separately for each project, while what I wanted was C++17 for any file I happen to open. On the other hand, it didn’t work (maybe I didn’t configure it properly).&lt;/p&gt;
&lt;p&gt;So here is the final solution. Open (create it if it does not exist) &lt;code&gt;~/.config/clangd/config.yaml&lt;/code&gt; and write:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;ompileFlags&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;  A&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;-s&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;td=c++20&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cool. Now let’s have fun with C++20.&lt;/p&gt;
&lt;h2 id=&quot;edit-on-2023-10-21&quot;&gt;Edit on 2023-10-21&lt;a class=&quot;anchor&quot; href=&quot;#edit-on-2023-10-21&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The path above is for Linux. On macOS, the configuration file is &lt;code&gt;~/Library/Preferences/clangd/config.yaml&lt;/code&gt; (on Windows it is &lt;code&gt;%LocalAppData%\clangd\config.yaml&lt;/code&gt;). For details, see the &lt;a rel=&quot;external&quot; href=&quot;https://clangd.llvm.org/config#files&quot;&gt;clangd configuration docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can also use &lt;code&gt;If&lt;/code&gt; in &lt;code&gt;config.yaml&lt;/code&gt; to avoid adding &lt;code&gt;-std=c++2b&lt;/code&gt; to C files (which is funny):&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;  P&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;athExclude&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;*\.c&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;*\.h&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;ompileFlags&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;  A&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-14&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;-std=c++2b&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Excluding &lt;code&gt;.h&lt;/code&gt; keeps C headers working, but C++ headers with a &lt;code&gt;.h&lt;/code&gt; extension then fall back to the default standard. If your C++ code uses &lt;code&gt;.h&lt;/code&gt; headers, exclude only &lt;code&gt;.*\.c&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Revised in October 2026.&lt;/em&gt; Both configurations were checked with &lt;code&gt;clangd --check&lt;/code&gt; (clangd 23). The C++14 default described above belongs to Clang 15 and earlier; since Clang 16 the default is &lt;code&gt;gnu++17&lt;/code&gt;, so &lt;code&gt;std::string_view&lt;/code&gt; works out of the box, but you still need this file for C++20 or C++23. Current compilers also accept &lt;code&gt;-std=c++23&lt;/code&gt; in place of &lt;code&gt;-std=c++2b&lt;/code&gt;. The note on &lt;code&gt;.h&lt;/code&gt; headers is new.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>从析构输出看 explicit、emplace_back 与 vector 扩容</title>
          <pubDate>Tue, 22 Feb 2022 00:00:00 +0000</pubDate>
          <author>Jia Zhang</author>
          <link>https://jiaz.dev/blog/emplace-back-and-reallocation/</link>
          <guid>https://jiaz.dev/blog/emplace-back-and-reallocation/</guid>
          <description xml:base="https://jiaz.dev/blog/emplace-back-and-reallocation/">&lt;p&gt;本文是我的 C++ 笔记的第三篇。&lt;/p&gt;
&lt;h2 id=&quot;explicit&quot;&gt;explicit&lt;a class=&quot;anchor&quot; href=&quot;#explicit&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;explicit&lt;/code&gt; 用来防止类的构造函数被用于隐式转换。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt; A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    A&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x_&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x_&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; OK&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样是对的。而加上 &lt;code&gt;explicit&lt;/code&gt; 之后：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt; A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    explicit&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x_&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x_&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 编译错误：拷贝初始化不能调用 explicit 构造函数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; OK&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;xi-gou-han-shu-yi-dong-gou-zao-yu-emplace-back&quot;&gt;析构函数、移动构造与 emplace_back&lt;a class=&quot;anchor&quot; href=&quot;#xi-gou-han-shu-yi-dong-gou-zao-yu-emplace-back&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;看下面的代码：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;iostream&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;using&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; namespace&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt; A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    A&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; xx&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;xx&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    A&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    ~A&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; cout&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;goodbye &lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; endl&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt;    vector&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-6&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;    v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;0&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;    v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;    v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;    cout&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;--------------------------------------&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它的输出是：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原因如下。&lt;/p&gt;
&lt;p&gt;首先，&lt;code&gt;emplace_back&lt;/code&gt; 只有在传入构造函数的参数列表时才和 &lt;code&gt;push_back&lt;/code&gt; 有区别，其他时候没有区别。&lt;code&gt;emplace_back(A{0})&lt;/code&gt; 相当于先生成临时对象 &lt;code&gt;A{0}&lt;/code&gt;，再把它拷贝构造到 &lt;code&gt;v&lt;/code&gt; 里。注意 &lt;code&gt;A&lt;/code&gt; 有用户声明的析构函数，所以编译器不会为它隐式生成移动构造函数，这里只能拷贝。语句结束时临时对象析构，于是输出一次 &lt;code&gt;goodbye 0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;之后要加入 &lt;code&gt;A{1}&lt;/code&gt;，而此时 &lt;code&gt;v&lt;/code&gt; 的容量只有 1，需要重新申请一块容量为 2 的空间。以 libstdc++ 为例：先在新空间里用临时对象 &lt;code&gt;A{1}&lt;/code&gt; 拷贝构造出新元素，再把原来的 &lt;code&gt;A{0}&lt;/code&gt; 拷贝过去，然后析构旧空间里的 &lt;code&gt;A{0}&lt;/code&gt;，输出 &lt;code&gt;goodbye 0&lt;/code&gt;。&lt;code&gt;emplace_back&lt;/code&gt; 返回之后，临时对象 &lt;code&gt;A{1}&lt;/code&gt; 析构，输出 &lt;code&gt;goodbye 1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;加入 &lt;code&gt;A{2}&lt;/code&gt; 的过程一样：容量从 2 扩到 4，旧的 &lt;code&gt;A{0}&lt;/code&gt;、&lt;code&gt;A{1}&lt;/code&gt; 被拷贝过去后析构，最后临时对象 &lt;code&gt;A{2}&lt;/code&gt; 析构。&lt;/p&gt;
&lt;p&gt;最终，三个元素的生命周期随着 &lt;code&gt;v&lt;/code&gt; 一起结束，依次析构。&lt;/p&gt;
&lt;p&gt;我们把 &lt;code&gt;capacity&lt;/code&gt; 打印出来，就能看到上面的猜测是正确的：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;cout&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;CAPACITY &lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;capacity&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; endl&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;0&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;cout&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;CAPACITY &lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;capacity&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; endl&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;cout&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;CAPACITY &lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;capacity&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; endl&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;cout&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;CAPACITY &lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;capacity&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; endl&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;cout&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;--------------------------------------&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CAPACITY 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CAPACITY 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CAPACITY 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CAPACITY 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而如果提前预留空间：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;reserve&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;0&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;1&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就不会再发生扩容，输出变为：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;剩下的三次 &lt;code&gt;goodbye&lt;/code&gt; 来自三个临时对象。如果直接把构造参数传给 &lt;code&gt;emplace_back&lt;/code&gt;，连临时对象也没有了：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;reserve&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goodbye 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;jie-lun&quot;&gt;结论&lt;a class=&quot;anchor&quot; href=&quot;#jie-lun&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;emplace_back&lt;/code&gt; 以构造参数列表的形式传入（如 &lt;code&gt;v.emplace_back(0)&lt;/code&gt;）时，不论有没有移动构造函数，都是原地构造，只调用一次构造函数。只有这一点和 &lt;code&gt;push_back&lt;/code&gt; 有区别，其他情况两者都一样。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以左值对象的形式传入时，不论有没有移动构造函数，都调用一次拷贝构造函数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以右值对象的形式传入（例如 &lt;code&gt;std::move(左值对象)&lt;/code&gt;，或者本身就是临时对象，如 &lt;code&gt;v.emplace_back(A{0})&lt;/code&gt;）时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有移动构造函数，调用一次移动构造；&lt;/li&gt;
&lt;li&gt;没有移动构造函数，调用拷贝构造函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果传入的是临时对象，那么过程是：构造临时对象，再移动构造（或拷贝构造）到容器里，最后临时对象析构。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;2026 年 10 月修订。&lt;/em&gt; 修正了 &lt;code&gt;explicit&lt;/code&gt; 的拼写和示例里重复定义的变量名，补上了 &lt;code&gt;#include&lt;/code&gt;。扩容那一段按实际顺序重写：新元素先在新空间里构造，旧元素搬过去之后才析构，临时对象最后析构。补充了 &lt;code&gt;A&lt;/code&gt; 没有移动构造函数的原因（用户声明了析构函数），以及直接传构造参数的对照实验。原文结论里借用的 &lt;code&gt;Person(&quot;aaa&quot;, &quot;shandong&quot;, 1991)&lt;/code&gt; 例子换成了本文的 &lt;code&gt;A&lt;/code&gt;。上面的输出用 GCC 16（libstdc++，&lt;code&gt;-std=c++17&lt;/code&gt;）验证过。容量按 1、2、4 翻倍增长是 libstdc++ 和 libc++ 的实现；MSVC 按 1.5 倍增长，输出会不一样。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>CCPC 华为的一道趣题</title>
          <pubDate>Sun, 22 Aug 2021 00:00:00 +0000</pubDate>
          <author>Jia Zhang</author>
          <link>https://jiaz.dev/blog/ccpc-huawei-mean-puzzle/</link>
          <guid>https://jiaz.dev/blog/ccpc-huawei-mean-puzzle/</guid>
          <description xml:base="https://jiaz.dev/blog/ccpc-huawei-mean-puzzle/">&lt;p&gt;本文记录 CCPC 华为比赛中的一道题目。&lt;/p&gt;
&lt;h2 id=&quot;ti-mian&quot;&gt;题面&lt;a class=&quot;anchor&quot; href=&quot;#ti-mian&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;骤风起，仓颉飘飘乎不自觉于孤岛焉。岛无人迹，唯有有理数二族尔。一族曰甲分之乙，一族曰乙分之甲，甲、乙皆正整数。数之，则族族不竭其数。&lt;/p&gt;
&lt;p&gt;鹦鹉谓仓颉：“日择二数，合其为平均或调和平均。造得一，吾送汝归！”&lt;/p&gt;
&lt;p&gt;仓颉能归于九千九百九十九亿九千九百九十九万九千九百九十九日否？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;翻译过来就是：仓颉被一阵风刮到了一个荒无人烟的小岛上，岛上有两族有理数 $\frac{a}{b}$ 和 $\frac{b}{a}$（$a$、$b$ 为正整数），每族数都有无穷多个。鹦鹉告诉仓颉：“每天你可以选两个已有的数 $x$、$y$，把它们合成为 $\frac{x+y}{2}$ 或 $\frac{2xy}{x+y}$。如果你能合成出 1，我就送你回家！”问仓颉能否在 999999999999 天内回家。&lt;/p&gt;
&lt;p&gt;输入有 $T$ 组数据，每组给出 $a$ 和 $b$。&lt;/p&gt;
&lt;p&gt;输入样例：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出样例：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;No&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Yes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;zuo-fa&quot;&gt;做法&lt;a class=&quot;anchor&quot; href=&quot;#zuo-fa&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;先打表。因为是网络赛，可以先用 Mathematica 求出一些较小的情况，得到 $(1,3)$、$(1,7)$、$(1,15)$、$(7,9)$、$(3,13)$ 等都可以做到。&lt;/p&gt;
&lt;p&gt;猜想：约分之后（注意一定要约分），分子分母之和为 2 的幂时可以做到，否则做不到。&lt;/p&gt;
&lt;p&gt;写一份代码交上去试一下：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;cstdio&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;numeric&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    scanf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        scanf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%lld&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt; %lld&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;gcd&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        long&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 约分之后分子分母的和&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        puts&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;Yes&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;No&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发现是对的。&lt;/p&gt;
&lt;h2 id=&quot;zheng-ming&quot;&gt;证明&lt;a class=&quot;anchor&quot; href=&quot;#zheng-ming&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;接下来考虑怎么证明。&lt;/p&gt;
&lt;h3 id=&quot;chong-fen-xing&quot;&gt;充分性&lt;a class=&quot;anchor&quot; href=&quot;#chong-fen-xing&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;首先，对于 $2^n$ 个数，不断地两两取平均（像归并排序那样一层一层往上合并），经过 $2^n - 1$ 次操作就能得到它们整体的平均值，即&lt;/p&gt;
&lt;div&gt;$$\frac{x_1 + x_2 + \cdots + x_{2^n}}{2^n}$$&lt;/div&gt;
&lt;p&gt;若既约分数 $\frac{a}{b}$ 满足 $a + b = 2^k$，就可以看作手头有 $2^k$ 个数：$b$ 个 $\frac{a}{b}$ 和 $a$ 个 $\frac{b}{a}$。它们的平均值是&lt;/p&gt;
&lt;div&gt;$$\frac{b \cdot \frac{a}{b} + a \cdot \frac{b}{a}}{2^k} = \frac{a + b}{2^k} = 1$$&lt;/div&gt;
&lt;p&gt;即可满足条件。&lt;/p&gt;
&lt;p&gt;注意，若约分之前分子分母之和就是 2 的幂，那么约分之后也是：公约数 $g$ 整除 $a + b = 2^k$，所以 $g$ 本身也是 2 的幂，$\frac{a+b}{g}$ 仍是 2 的幂。但反过来不成立，约分之前不满足的，约分后也可能满足，例如 $\frac{3}{9}$。因此要先约分，再判断：既约分数的分子分母之和是 2 的幂，就一定可以。&lt;/p&gt;
&lt;h3 id=&quot;bi-yao-xing&quot;&gt;必要性&lt;a class=&quot;anchor&quot; href=&quot;#bi-yao-xing&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;那么，对于既约分数，如果分子分母之和不是 2 的幂，会怎么样？&lt;/p&gt;
&lt;p&gt;设分数为 $\frac{a}{b}$ 且既约，即 $\gcd(a, b) = 1$。$a + b \ge 2$ 且不是 2 的幂，等价于存在奇素数 $p$ 使得 $p \mid a + b$。&lt;/p&gt;
&lt;p&gt;我们证明下面这个性质始终成立：手里的每个数写成既约分数 $\frac{x}{y}$ 之后，都满足 $p \mid x + y$。一开始的 $\frac{a}{b}$ 和 $\frac{b}{a}$ 显然满足。&lt;/p&gt;
&lt;p&gt;设手里两个满足条件的既约分数 $\frac{x}{y}$ 和 $\frac{u}{v}$，即 $x \equiv -y$，$u \equiv -v \pmod{p}$。先看算术平均：&lt;/p&gt;
&lt;div&gt;$$\frac{1}{2}\left(\frac{x}{y} + \frac{u}{v}\right) = \frac{xv + uy}{2yv}$$&lt;/div&gt;
&lt;p&gt;它的分子分母之和满足&lt;/p&gt;
&lt;div&gt;$$xv + uy + 2yv \equiv -yv - vy + 2yv = 0 \pmod{p}$$&lt;/div&gt;
&lt;p&gt;这一步可能会发生约分，但不会约去 $p$。因为若 $p$ 整除公约数，则 $p \mid 2yv$，而 $p$ 是奇数，所以 $p \mid y$ 或 $p \mid v$。若 $p \mid y$，结合 $p \mid x + y$ 可得 $p \mid x$，与 $\frac{x}{y}$ 是既约分数矛盾；$p \mid v$ 同理。既然公约数不含因子 $p$，约分之后的分子分母之和仍然被 $p$ 整除。&lt;/p&gt;
&lt;p&gt;调和平均同理：&lt;/p&gt;
&lt;div&gt;$$\frac{2 \cdot \frac{x}{y} \cdot \frac{u}{v}}{\frac{x}{y} + \frac{u}{v}} = \frac{2xu}{xv + uy}, \qquad 2xu + xv + uy \equiv 2yv - yv - vy = 0 \pmod{p}$$&lt;/div&gt;
&lt;p&gt;若 $p$ 整除公约数，则 $p \mid 2xu$，即 $p \mid x$ 或 $p \mid u$，同样与既约矛盾。&lt;/p&gt;
&lt;p&gt;所以无论怎么合成，得到的数的分子分母之和都含有奇素因子 $p$。而 $1 = \frac{1}{1}$，分子分母之和为 2，不含奇素因子，因此永远得不到 1。&lt;/p&gt;
&lt;p&gt;证明完毕。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;2026 年 10 月修订。&lt;/em&gt; 原文的判定代码重写得更短：改用 &lt;code&gt;std::gcd&lt;/code&gt; 和位运算判断 2 的幂，并改用 &lt;code&gt;long long&lt;/code&gt;，避免分子分母相加时溢出。必要性部分把第二个分数记作 $\frac{u}{v}$（原文沿用了 $\frac{a}{b}$，容易和题目里的 $a$、$b$ 混淆），并写出了原文一笔带过（“同理”）的调和平均一步。另外，充分性的构造需要 $2^k - 1$ 天；只要 $a + b \le 2^{39}$（$a$、$b$ 在 &lt;code&gt;int&lt;/code&gt; 范围内时远远满足），天数限制就不起作用。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>C Hello World Again</title>
          <pubDate>Sat, 02 Jan 2021 00:00:00 +0000</pubDate>
          <author>Jia Zhang</author>
          <link>https://jiaz.dev/blog/c-hello-world-again/</link>
          <guid>https://jiaz.dev/blog/c-hello-world-again/</guid>
          <description xml:base="https://jiaz.dev/blog/c-hello-world-again/">&lt;p&gt;本文是我给地空学院的同学做的 C 语言讲座的讲稿。&lt;/p&gt;
&lt;h2 id=&quot;zhi-zhen-yu-shu-zu&quot;&gt;指针与数组&lt;a class=&quot;anchor&quot; href=&quot;#zhi-zhen-yu-shu-zu&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;a[i]&lt;/code&gt;、&lt;code&gt;*(a + i)&lt;/code&gt; 和 &lt;code&gt;i[a]&lt;/code&gt; 是一回事：下标运算 &lt;code&gt;a[i]&lt;/code&gt; 本来就定义为 &lt;code&gt;*(a + i)&lt;/code&gt;，而加法可以交换。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;int (*x)[10]&lt;/code&gt; 与 &lt;code&gt;int *x[10]&lt;/code&gt; 的区别：前者是一个&lt;strong&gt;指针&lt;/strong&gt;，指向长度为 10 的 &lt;code&gt;int&lt;/code&gt; 数组；后者是一个长度为 10 的&lt;strong&gt;数组&lt;/strong&gt;，每个元素都是指向 &lt;code&gt;int&lt;/code&gt; 的指针。&lt;/p&gt;
&lt;p&gt;指针与数组可以互换着用：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;    a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;p &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; p &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;!=&lt;/span&gt;&lt;span&gt; a &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;c-feng-ge-de-zi-fu-chuan&quot;&gt;C 风格的字符串&lt;a class=&quot;anchor&quot; href=&quot;#c-feng-ge-de-zi-fu-chuan&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&quot;zi-fu-chuan-de-biao-shi&quot;&gt;字符串的表示&lt;a class=&quot;anchor&quot; href=&quot;#zi-fu-chuan-de-biao-shi&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;Hello&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;s &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;Hello&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 这是一个特殊的行为：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 注意 int *x = 2; 是完全错误的，但这个语句是对的。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 编译器会开辟一块内存来存放 &amp;quot;Hello&amp;quot;，并让 s 指向它。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 但注意：这个 &amp;quot;Hello&amp;quot; 是不可修改的，下面的语句是未定义行为，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 通常会因为写只读内存而崩溃：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%c&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;abc&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 输出 c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;abc&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 输出 bc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 这里的 &amp;quot;abc&amp;quot; 是数组 {&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;c&amp;#39;, &amp;#39;\0&amp;#39;}，在表达式里退化成指向首元素的指针&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 剩下的元素都是 0，所以它也是以 &amp;#39;\0&amp;#39; 结尾的字符串&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;s &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;malloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span&gt;s &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;           //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; malloc 得到的内存没有初始化，要自己写上结尾的 &amp;#39;\0&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; s &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 输出 bc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; s &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 输出 c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;s &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;         //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 释放 malloc 申请的内存，必须传回 malloc 返回的那个地址&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;zi-fu-chuan-kao-bei&quot;&gt;字符串拷贝&lt;a class=&quot;anchor&quot; href=&quot;#zi-fu-chuan-kao-bei&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; strcpy1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 把 b 拷贝到 a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        *&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    *&lt;/span&gt;&lt;span&gt;a &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    char&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    char&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;scanf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%99s&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        strcpy1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;qiu-zhi-shun-xu&quot;&gt;求值顺序&lt;a class=&quot;anchor&quot; href=&quot;#qiu-zhi-shun-xu&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%c&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%c&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%c&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; getchar&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; getchar&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; getchar&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入 &lt;code&gt;abc&lt;/code&gt;，用 GCC 编译出来的程序（x86-64）输出 &lt;code&gt;cba&lt;/code&gt;，因为 GCC 在这里是从右向左对参数求值的；而用 Clang 编译出来的程序输出 &lt;code&gt;abc&lt;/code&gt;。C 标准没有规定函数参数的求值顺序，所以不要写依赖它的代码。&lt;/p&gt;
&lt;h2 id=&quot;bian-liang-zuo-yong-yu&quot;&gt;变量作用域&lt;a class=&quot;anchor&quot; href=&quot;#bian-liang-zuo-yong-yu&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 编译错误：x 只在上面的花括号里可见&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 8&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 输出 3，里层的 x 遮住了外层的 x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;yong-hong-shi-xian-max-han-shu&quot;&gt;用宏实现 max 函数&lt;a class=&quot;anchor&quot; href=&quot;#yong-hong-shi-xian-max-han-shu&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; MAX&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; y &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;?&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;:&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;考虑 &lt;code&gt;MAX(1 != 2, 3)&lt;/code&gt;，它展开为 &lt;code&gt;1 != 2 &amp;gt; 3 ? 1 != 2 : 3&lt;/code&gt;。由于 &lt;code&gt;!=&lt;/code&gt; 的优先级低于 &lt;code&gt;&amp;gt;&lt;/code&gt;，上式为 &lt;code&gt;(1 != (2 &amp;gt; 3)) ? (1 != 2) : 3&lt;/code&gt;，即 &lt;code&gt;(1 != 0) ? 1 : 3&lt;/code&gt;，结果为 1。而它本来应该是 &lt;code&gt;MAX(1, 3) = 3&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;因此给参数加上括号：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; MAX&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但考虑 &lt;code&gt;3 + MAX(1, 2)&lt;/code&gt;，它展开为 &lt;code&gt;3 + (1) &amp;gt; (2) ? (1) : (2)&lt;/code&gt;，即 &lt;code&gt;4 &amp;gt; 2 ? 1 : 2&lt;/code&gt;，结果为 1，而实际上应该是 5。&lt;/p&gt;
&lt;p&gt;因此继续修改这个宏，给整体也加上括号：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; MAX&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但考虑 &lt;code&gt;MAX(i++, j++)&lt;/code&gt;，展开后为 &lt;code&gt;((i++) &amp;gt; (j++) ? (i++) : (j++))&lt;/code&gt;：比较时 &lt;code&gt;i&lt;/code&gt; 和 &lt;code&gt;j&lt;/code&gt; 各自增一次，被选中的那个还会再自增一次。例如 &lt;code&gt;i = 1, j = 2&lt;/code&gt; 时，结果是 3 而不是 2，并且 &lt;code&gt;j&lt;/code&gt; 变成了 4。&lt;/p&gt;
&lt;p&gt;为此可以这么定义宏：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; MAX&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;          \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    __typeof__&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt; _x &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;   \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    __typeof__&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt; _y &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;   \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    _x &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; _y &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;?&lt;/span&gt;&lt;span&gt; _x &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;:&lt;/span&gt;&lt;span&gt; _y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;        \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个宏先把两个参数各求值一次，存进临时变量 &lt;code&gt;_x&lt;/code&gt; 与 &lt;code&gt;_y&lt;/code&gt; 再比较，从而使得 &lt;code&gt;MAX(i++, j++)&lt;/code&gt; 符合要求。注意 &lt;code&gt;({ ... })&lt;/code&gt;（语句表达式）和 &lt;code&gt;__typeof__&lt;/code&gt; 都是 GCC 扩展，Clang 也支持，但不是标准 C。&lt;/p&gt;
&lt;h2 id=&quot;han-shu-yu-shu-zu-de-xiang-si-dian&quot;&gt;函数与数组的相似点&lt;a class=&quot;anchor&quot; href=&quot;#han-shu-yu-shu-zu-de-xiang-si-dian&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;数组&lt;/th&gt;&lt;th&gt;函数&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;声明&lt;/td&gt;&lt;td&gt;&lt;code&gt;int x[10]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;int sum(int, int)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;类型&lt;/td&gt;&lt;td&gt;&lt;code&gt;int [10]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;int (int, int)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;指向它的指针&lt;/td&gt;&lt;td&gt;&lt;code&gt;int (*x)[10]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;int (*sum)(int, int)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;指针的类型&lt;/td&gt;&lt;td&gt;&lt;code&gt;int (*)[10]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;int (*)(int, int)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;数组和函数的共同点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数组和函数都不能被拷贝（不能整体赋值）。&lt;/li&gt;
&lt;li&gt;因为第 1 点，数组和函数都不能做函数的返回值，但函数可以返回指向数组的指针或指向函数的指针。&lt;/li&gt;
&lt;li&gt;数组和函数都可以写在函数的形参里，但因为第 1 点，编译器会对其做处理：如果形参类型是数组，实际的形参类型会转换成元素类型的指针，例如 &lt;code&gt;void fun(int arr[5])&lt;/code&gt; 等价于 &lt;code&gt;void fun(int *arr)&lt;/code&gt;；如果形参类型是函数，实际的形参类型会转换成对应的函数指针类型，例如 &lt;code&gt;void fun(int test())&lt;/code&gt; 等价于 &lt;code&gt;void fun(int (*test)())&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ru-he-fan-hui-yi-ge-shu-zu&quot;&gt;如何返回一个数组&lt;a class=&quot;anchor&quot; href=&quot;#ru-he-fan-hui-yi-ge-shu-zu&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;用结构体包装一下：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;stdio.h&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; MAXNUM&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Array&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;MAXNUM&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Array &lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;DoubleIt&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Array &lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    struct&lt;/span&gt;&lt;span&gt; Array y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; MAXNUM&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;        y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 移位的优先级比加减还低，和别的运算混用时要加括号&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    struct&lt;/span&gt;&lt;span&gt; Array a &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 5&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    struct&lt;/span&gt;&lt;span&gt; Array b &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; DoubleIt&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 5&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;tui-jian-yue-du&quot;&gt;推荐阅读&lt;a class=&quot;anchor&quot; href=&quot;#tui-jian-yue-du&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;《C 专家编程》&lt;/li&gt;
&lt;li&gt;《C 陷阱与缺陷》&lt;/li&gt;
&lt;li&gt;《征服 C 指针》&lt;/li&gt;
&lt;li&gt;《C 和指针》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上几本在图书馆应该都能借到。特别推荐《征服 C 指针》，它是日本最受欢迎的 C 语言书籍之一，写得很好。&lt;/p&gt;
&lt;h2 id=&quot;c-xue-xi-jing-yan&quot;&gt;C 学习经验&lt;a class=&quot;anchor&quot; href=&quot;#c-xue-xi-jing-yan&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;多写一些简单的程序做实验，验证自己的想法，从实践中学习。&lt;/li&gt;
&lt;li&gt;多写代码，多写代码，多写代码。&lt;/li&gt;
&lt;li&gt;找一些好书看，不要看谭浩强之类的。&lt;/li&gt;
&lt;li&gt;学会使用搜索引擎。&lt;/li&gt;
&lt;li&gt;不要害怕写代码，其实真的不难。这属于技术活，写得越多越熟练。&lt;/li&gt;
&lt;li&gt;C 是比较偏向底层的语言，如果有计算机硬件和底层相关的知识，会更好理解。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;2026 年 10 月修订。&lt;/em&gt; 几处更正：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;求值顺序：原文说 GCC 一定从右向左求值。实际上 C 标准没有规定函数参数的求值顺序；GCC 16 在 x86-64 上的确输出 &lt;code&gt;cba&lt;/code&gt;，但 Clang 23 输出 &lt;code&gt;abc&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MAX(i++, j++)&lt;/code&gt;：原文说 &lt;code&gt;i&lt;/code&gt; 和 &lt;code&gt;j&lt;/code&gt; 都会自增两次，实际上只有被选中的那个会自增两次。语句表达式版本改用 &lt;code&gt;__typeof__&lt;/code&gt;，不再只能比较 &lt;code&gt;int&lt;/code&gt;，并注明它是 GCC 扩展。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strcpy1&lt;/code&gt;：原来的版本没有写结尾的 &lt;code&gt;&#39;\0&#39;&lt;/code&gt;，而是去清空目标缓冲区里残留的字符，对没有初始化的数组会越界读写；改成了直接写 &lt;code&gt;&#39;\0&#39;&lt;/code&gt;。&lt;code&gt;scanf&lt;/code&gt; 加了长度限制和返回值检查。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;malloc&lt;/code&gt; 的例子补上了结尾的 &lt;code&gt;&#39;\0&#39;&lt;/code&gt;，否则 &lt;code&gt;printf(&quot;%s&quot;)&lt;/code&gt; 会读到未初始化的内存。&lt;/li&gt;
&lt;li&gt;修改字符串字面量是未定义行为，不保证报错；&lt;code&gt;void fun(int arr*)&lt;/code&gt; 改为 &lt;code&gt;void fun(int *arr)&lt;/code&gt;；移位运算符优先级的注释改得更准确。&lt;/li&gt;
&lt;li&gt;推荐书目合并成一个列表，删去了书名无法确认的《明解 C 指针》，《C 与指针》更正为中译本书名《C 和指针》。&lt;/li&gt;
&lt;/ul&gt;
</description>
      </item>
      <item>
          <title>N Queens Problem</title>
          <pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate>
          <author>Jia Zhang</author>
          <link>https://jiaz.dev/blog/n-queens/</link>
          <guid>https://jiaz.dev/blog/n-queens/</guid>
          <description xml:base="https://jiaz.dev/blog/n-queens/">&lt;p&gt;This article presents a fast way to find a solution to the famous N queens problem.&lt;/p&gt;
&lt;p&gt;Note that we only look for &lt;em&gt;one&lt;/em&gt; valid placement, not &lt;em&gt;all&lt;/em&gt; of them. For N = 8 there are 92 placements; our program just finds one of those 92. If the problem itself is unfamiliar, the &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Eight_queens_puzzle&quot;&gt;Wikipedia article&lt;/a&gt; is a good start.&lt;/p&gt;
&lt;h2 id=&quot;n-4&quot;&gt;N = 4&lt;a class=&quot;anchor&quot; href=&quot;#n-4&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;When N = 4 there are only two placements (&lt;code&gt;1&lt;/code&gt; is a queen):&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0100        0010&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0001        1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1000        0001&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0010        0100&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our program will find one of the two. So, here we go.&lt;/p&gt;
&lt;h2 id=&quot;the-idea&quot;&gt;The idea&lt;a class=&quot;anchor&quot; href=&quot;#the-idea&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Representation.&lt;/strong&gt; Put exactly one queen in every row and store only its column: &lt;code&gt;queen[i] = j&lt;/code&gt; means the queen of row &lt;code&gt;i&lt;/code&gt; stands in column &lt;code&gt;j&lt;/code&gt;. If &lt;code&gt;queen&lt;/code&gt; is a permutation of &lt;code&gt;1..N&lt;/code&gt;, no two queens share a row or a column, so the only possible conflicts are on the diagonals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagonals.&lt;/strong&gt; Number the anti-diagonals by &lt;code&gt;row + column&lt;/code&gt; (from 2 to 2N) and the main diagonals by &lt;code&gt;column - row&lt;/code&gt; (from 1 - N to N - 1). The arrays &lt;code&gt;dn&lt;/code&gt; and &lt;code&gt;dp&lt;/code&gt; count how many queens stand on each of them. The evaluation function &lt;code&gt;collisions&lt;/code&gt; is the sum, over all diagonals, of the queens beyond the first one. A placement is a solution exactly when &lt;code&gt;collisions == 0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moves.&lt;/strong&gt; The only move is swapping the columns of two rows. A swap keeps &lt;code&gt;queen&lt;/code&gt; a permutation and touches just four diagonals, so its effect on &lt;code&gt;collisions&lt;/code&gt; is computed in constant time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A good start.&lt;/strong&gt; Most of the work goes into the initial placement. Row by row, we pick a random queen among the ones not placed yet and keep it only if it attacks none of the queens already placed. After at most 4N attempts we give up and place the rest at random. For large N this greedy start leaves only a handful of collisions, so the search that follows is short.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hill climbing.&lt;/strong&gt; We keep a list &lt;code&gt;attack&lt;/code&gt; of the queens that are under attack. For each of them we pick a random partner and swap the two if the swap lowers &lt;code&gt;collisions&lt;/code&gt;. Recomputing the list after every swap would be too expensive, so it is rebuilt only when &lt;code&gt;collisions&lt;/code&gt; has dropped below half of its value at the last rebuild.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Random restart.&lt;/strong&gt; If the climb has made about 32N attempts without reaching zero, it is stuck in a local minimum, and we start over with a new random placement.&lt;/p&gt;
&lt;p&gt;This scheme is essentially the conflict-minimizing local search of Rok Sosič and Jun Gu (&lt;a rel=&quot;external&quot; href=&quot;https://doi.org/10.1109/69.317698&quot;&gt;&lt;em&gt;Efficient local search with conflict minimization: a case study of the n-queens problem&lt;/em&gt;&lt;/a&gt;, IEEE TKDE, 1994).&lt;/p&gt;
&lt;h2 id=&quot;code&quot;&gt;Code&lt;a class=&quot;anchor&quot; href=&quot;#code&quot; aria-label=&quot;Link to this section&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The program takes N on the command line and optionally a file to write the placement to (the column of each row, followed by a drawing of the board when N ≤ 20). It checks the result independently before reporting it.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;stdint.h&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;stdio.h&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;stdlib.h&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;time.h&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; queen[i] = j 表示第 i 行的皇后在第 j 列（行列都从 1 开始编号）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; dn[k]：编号为 k = 行号 + 列号 的反对角线上有几个皇后，k ∈ [2, 2n]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; dp[k]：编号为 k = 列号 - 行号 的主对角线上有几个皇后，k ∈ [1-n, n-1]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; attack[]：所有正在被攻击的皇后的行号&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;dn&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;dp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; long&lt;/span&gt;&lt;span&gt; collisions&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 评估函数：每条对角线上多出来的皇后个数之和&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; uint64_t&lt;/span&gt;&lt;span&gt; rng_state&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 64 位线性同余随机数（Knuth MMIX 的参数），只用高 32 位&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; uint32_t&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; next_random&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    rng_state &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; rng_state &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 6364136223846793005&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;ULL&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1442695040888963407&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;ULL&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;uint32_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;rng_state &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 32&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; [0, k) 内的随机整数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; random_below&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;next_random&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; %&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;uint32_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; swap_int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; temp &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    *&lt;/span&gt;&lt;span&gt;p &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    *&lt;/span&gt;&lt;span&gt;q &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; temp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 把第 row 行的皇后从棋盘上拿走&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; remove_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; col &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;dn&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;col &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 这条对角线上原来就不止一个皇后&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        --&lt;/span&gt;&lt;span&gt;collisions&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;dp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;col &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        --&lt;/span&gt;&lt;span&gt;collisions&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 把第 row 行的皇后放到第 col 列&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; place_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; col&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;    queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span&gt; col&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;dn&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;col &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 这条对角线上已经有皇后了&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        ++&lt;/span&gt;&lt;span&gt;collisions&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;dp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;col &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        ++&lt;/span&gt;&lt;span&gt;collisions&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 交换第 i 行和第 j 行的皇后，同时更新 dn、dp 和 collisions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; swap_queens&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; ci &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; cj &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    remove_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    remove_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    place_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; cj&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    place_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; ci&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; is_attacked&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; dn&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; dp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; -&lt;/span&gt;&lt;span&gt; row&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 重新计算 attack 数组，返回被攻击的皇后个数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; compute_attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;is_attacked&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;            attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;++&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 生成初始棋盘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; initialize&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;        dn&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; -&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;        dp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    collisions &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;        queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 我们的目标是在初始化阶段生成一个很好的初态，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 这样初态的 collisions 已经很小，爬山的过程会大幅度缩短。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 做法是在初始化的时候就尽可能地避免碰撞：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 逐行从剩下的皇后里随机挑一个，如果放在这一行不和已经放好的皇后冲突，就采用它。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; j 表示已经有多少个皇后被优化处理了（下一个要放的是第 j 行），&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; i 用来限制优化阶段所用的时间，超过 search_max 次尝试就强制退出。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    long&lt;/span&gt;&lt;span&gt; search_max &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;long&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; search_max &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        int&lt;/span&gt;&lt;span&gt; m &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; random_below&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; m 为 [j, n] 之间的一个随机数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;dn&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; dp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; -&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;            swap_int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;            place_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;            ++&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 剩下的皇后随机打乱后直接放上去，同时累计 dn、dp 和 collisions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        int&lt;/span&gt;&lt;span&gt; m &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; random_below&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        swap_int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        place_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 找到一组解：初始化 + 爬山，陷入局部最优时随机重启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; solve&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        initialize&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;collisions &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;            return&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; limit 用来决定何时重新计算 attack 数组。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 每次交换都重新计算的话开销太大，所以设一个阈值：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 只有当 collisions 降到 limit 以下时才重新计算。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        long&lt;/span&gt;&lt;span&gt; limit &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; collisions &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        int&lt;/span&gt;&lt;span&gt; number_of_attacks &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; compute_attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; loopcount 用来判断何时随机重启：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 它比较大时，说明爬山法陷入了局部困境&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        long&lt;/span&gt;&lt;span&gt; loopcount &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        while&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;loopcount &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 32&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;            for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; number_of_attacks&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;                //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 取一个被攻击的皇后和一个随机的皇后，看交换它们能不能减少冲突&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;                int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;                int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; random_below&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;==&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                    continue&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;                long&lt;/span&gt;&lt;span&gt; before &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; collisions&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;                swap_queens&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;collisions &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span&gt; before&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;                {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;                    swap_queens&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 没有变好，换回去&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                    continue&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;collisions &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                    return&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;collisions &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; limit&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;                {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;                    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 棋盘变动较大，重新计算 attack 数组&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    limit &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; collisions &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    number_of_attacks &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; compute_attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            loopcount &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+=&lt;/span&gt;&lt;span&gt; number_of_attacks&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 独立地检查一遍答案：每列恰好一个皇后，且没有两个皇后在同一条对角线上&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; verify&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;col &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; calloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;size_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;d1 &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; calloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;size_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;d2 &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; calloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;size_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span&gt; ok &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; col &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; d1 &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; d2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; ok &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;        int&lt;/span&gt;&lt;span&gt; c &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;c &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ||&lt;/span&gt;&lt;span&gt; c &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; col&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; d1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;c &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; d2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;c &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ok &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;            col&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; d1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;c &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; d2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;c &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;col&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;d1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;d2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span&gt; ok&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; argc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; char&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;argc &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; atoi&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ||&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 100000000&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        fprintf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;stderr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;usage: &lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt; N [output-file]   (1 &amp;lt;= N &amp;lt;= 100000000)&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; argv&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ||&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;no solution for N = &lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 下面几个数组的下标可能为负，所以先开辟空间，再让指针指向合适的位置，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 例如 queen[1] = pre_queen[0]，dn[2] = pre_dn[0]，dp[1-n] = pre_dp[0]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;pre_queen &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; malloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;size_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;pre_dn &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; malloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;size_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;pre_dp &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; malloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;size_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span&gt;pre_attack &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; malloc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;size_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;!&lt;/span&gt;&lt;span&gt;pre_queen &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; !&lt;/span&gt;&lt;span&gt;pre_dn &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; !&lt;/span&gt;&lt;span&gt;pre_dp &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; !&lt;/span&gt;&lt;span&gt;pre_attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        fprintf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;stderr&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;out of memory&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    queen &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; pre_queen &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dn &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; pre_dn &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dp &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; pre_dp &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    attack &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span&gt; pre_attack &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    rng_state &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;uint64_t&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    clock_t&lt;/span&gt;&lt;span&gt; start &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; clock&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    solve&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;    clock_t&lt;/span&gt;&lt;span&gt; end &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; clock&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    printf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;N = &lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;: found a solution in &lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%.3f&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt; seconds (&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;           (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;end &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;-&lt;/span&gt;&lt;span&gt; start&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; /&lt;/span&gt;&lt;span&gt; CLOCKS_PER_SEC&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; verify&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;verified&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;INVALID&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;argc &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        FILE &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;*&lt;/span&gt;&lt;span&gt;fp &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt; fopen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;!&lt;/span&gt;&lt;span&gt;fp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;            perror&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;            return&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-16 z-d-9&quot;&gt; 第 i 个数是第 i 行皇后所在的列；N 不超过 20 时再画出棋盘（* 为皇后）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;            fprintf&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;fp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%d&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;%c&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;==&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 20&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;            for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;                for&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ++&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;                    fputc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;j &lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-21 z-d-16&quot;&gt; queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-18 z-d-21&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-23 z-d-18&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; fp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;                fputc&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-17 z-d-20&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-24 z-d-19&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;,&lt;/span&gt;&lt;span&gt; fp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;        fclose&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;fp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;pre_queen&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;pre_dn&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;pre_dp&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-11&quot;&gt;    free&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;pre_attack&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-4&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-3&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-15 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Build and run:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ cc -O2 -o nqueens nqueens.c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ ./nqueens 8 out.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;N = 8: found a solution in 0.000 seconds (verified)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ cat out.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5 1 8 6 3 7 2 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;----*---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;*-------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-------*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-----*--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--*-----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;------*-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-*------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---*----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ ./nqueens 1000000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;N = 1000000: found a solution in 0.060 seconds (verified)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The placement differs between runs because the random seed comes from the clock.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Revised in October 2026.&lt;/em&gt; The original program had a few bugs, fixed above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It picked the random partner with &lt;code&gt;((rand() &amp;lt;&amp;lt; 6) + rand()) % n + 1&lt;/code&gt;. On glibc, where &lt;code&gt;RAND_MAX&lt;/code&gt; is 2&lt;sup&gt;31&lt;/sup&gt; − 1, the shift overflows &lt;code&gt;int&lt;/code&gt;, which is undefined behaviour; in practice the index went negative and the program wrote outside its arrays. For large N it printed placements that were not even permutations. The program now uses its own 64-bit generator.&lt;/li&gt;
&lt;li&gt;The change in &lt;code&gt;collisions&lt;/code&gt; caused by a swap was computed with a shortcut formula that is wrong when the two queens share a diagonal, so &lt;code&gt;collisions&lt;/code&gt; could drift from the true count. A swap is now applied as “remove both queens, put them back swapped” and undone if it does not help, which is exact.&lt;/li&gt;
&lt;li&gt;The arrays were always allocated for 123,456,789 queens; they are now sized by N. N = 2 and N = 3, which have no solution, used to loop forever.&lt;/li&gt;
&lt;li&gt;Interactive prompts were replaced by command-line arguments, and the solution is verified before it is printed. Timings above were measured on an AMD Ryzen 9 9950X.&lt;/li&gt;
&lt;/ul&gt;
</description>
      </item>
    </channel>
</rss>
