<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>解のある配置を作る</title><revhistory><revision><revnumber>41</revnumber><date>2012-01-25 00:55:25</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>40</revnumber><date>2012-01-12 07:48:54</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>39</revnumber><date>2012-01-12 07:28:24</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>38</revnumber><date>2012-01-12 07:17:18</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>37</revnumber><date>2012-01-11 12:17:20</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>36</revnumber><date>2012-01-11 11:55:37</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>35</revnumber><date>2012-01-11 11:55:25</date><authorinitials>masahiko</authorinitials><revremark>名前を'ばらばらにする'から変更。</revremark></revision><revision><revnumber>34</revnumber><date>2011-01-10 00:55:46</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>33</revnumber><date>2011-01-09 01:26:58</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>32</revnumber><date>2011-01-09 01:15:48</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>31</revnumber><date>2011-01-09 01:14:16</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>30</revnumber><date>2010-01-13 00:34:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>29</revnumber><date>2010-01-12 02:31:25</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>28</revnumber><date>2010-01-05 02:26:14</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>27</revnumber><date>2010-01-05 02:20:27</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>26</revnumber><date>2010-01-05 02:14:31</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>25</revnumber><date>2010-01-05 02:09:34</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>24</revnumber><date>2010-01-05 02:00:43</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>23</revnumber><date>2010-01-05 01:57:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>22</revnumber><date>2010-01-05 01:57:18</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>21</revnumber><date>2010-01-05 01:55:02</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>20</revnumber><date>2010-01-05 01:32:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>19</revnumber><date>2010-01-05 01:28:16</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>18</revnumber><date>2010-01-05 01:25:58</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>17</revnumber><date>2010-01-05 01:10:38</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>16</revnumber><date>2010-01-05 01:05:01</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>15</revnumber><date>2010-01-05 00:56:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>14</revnumber><date>2010-01-05 00:53:15</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>13</revnumber><date>2010-01-05 00:52:17</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>12</revnumber><date>2010-01-05 00:50:32</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>11</revnumber><date>2010-01-05 00:47:09</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>10</revnumber><date>2010-01-05 00:45:11</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>9</revnumber><date>2009-12-22 12:16:33</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>8</revnumber><date>2009-12-22 12:11:44</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>7</revnumber><date>2009-12-22 12:04:41</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>6</revnumber><date>2009-12-17 07:52:06</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>5</revnumber><date>2009-12-15 12:40:03</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>4</revnumber><date>2009-12-15 12:37:31</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2009-12-07 01:07:14</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2009-12-07 01:04:49</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2009-12-04 06:16:15</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>解のある配置を作る</title><para>右下の１つを除いた他のピースをばらばらに入れ替えた後、 スライドするだけで元の位置に戻すのがこのパズル(１５ゲーム)の問題です。 </para><para>どんなにばらばらに配置しても元の位置にもどせるのかというと、そうではありません。 </para><itemizedlist><listitem override="none"><para><emphasis role="strong">元にもどせる配置と、元にもどせない配置があります。</emphasis> </para></listitem></itemizedlist><para>どんな配置だと元にもどせるかを解説した後、 元にもどせる配置だけを作成するメソッドを示します。 </para><!--rule (<hr>) is not applicable to DocBook--><section><title>ちょっと数学的な説明</title><itemizedlist><listitem override="none"><para>並び、置換、互換とその関係の説明をします。 </para></listitem></itemizedlist><section><title>並び</title><para>並べるものの一つ一つを数で表すことにすると、 例えば５つのものの<emphasis role="strong">並び</emphasis>は </para><itemizedlist><listitem override="none"><para>(1,2,3,4,5) や </para></listitem><listitem override="none"><para>(1,3,5,4,2) や </para></listitem><listitem override="none"><para>(4,3,2,5,1) </para></listitem></itemizedlist><para>のように書けます。 </para><para>並び(4,3,2,5,1)は </para><itemizedlist><listitem override="none"><para>４という目印のものが１番目に </para></listitem><listitem override="none"><para>３という目印のものが２番目に </para></listitem><listitem override="none"><para>２という目印のものが３番目に </para></listitem><listitem override="none"><para>５という目印のものが４番目に </para></listitem><listitem override="none"><para>１という目印のものが５番目に </para></listitem></itemizedlist><para>並んでいることを表しています。 </para></section><section><title>置換</title><itemizedlist><listitem override="none"><para>ものの並びの順番を入れ替える操作を(数学の用語では)<emphasis role="strong">置換</emphasis>と言います。 </para></listitem></itemizedlist><para>たとえば </para><itemizedlist><listitem override="none"><para>並び(1,2,3,4,5)を </para></listitem><listitem override="none"><para>並び(1,3,5,4,2)に変える操作 </para></listitem></itemizedlist><para>も置換の１つです。 </para></section><section><title>互換</title><itemizedlist><listitem override="none"><para>置換のうち２つの要素を互いに入れ替えるものを互換といいます。 </para></listitem></itemizedlist><para>たとえば </para><itemizedlist><listitem override="none"><para>並び(1,2,3,4,5)を </para></listitem><listitem override="none"><para>並び(2,1,3,4,5)に変える操作 </para></listitem></itemizedlist><para>は互換の１つです。 </para><para>交換される２つ以外の要素の位置は変わりません。 </para></section><section><title>互換の積</title><itemizedlist><listitem override="none"><para>置換は互換の積で表すことができます。 </para></listitem></itemizedlist><para>どんな置換(入れ替え)も、互換(２つの入れ替え)を繰り返すことで行うことができるという意味です。 </para><para>たとえば、並び(1,2,3,4,5)を並び(1,3,5,4,2)に変えるには </para><itemizedlist><listitem override="none"><informaltable><tgroup cols="3"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><tbody><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>元の状態</para></entry><entry align="center" colsep="1" rowsep="1"><para>互換</para></entry><entry align="center" colsep="1" rowsep="1"><para>入れ替え後の状態</para></entry></row><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>(1,2,3,4,5)</para></entry><entry align="center" colsep="1" rowsep="1"><para>2と3を入れ替え</para></entry><entry align="center" colsep="1" rowsep="1"><para>(1,3,2,4,5)</para></entry></row><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>(1,3,2,4,5)</para></entry><entry align="center" colsep="1" rowsep="1"><para>2と5を入れ替え</para></entry><entry align="center" colsep="1" rowsep="1"><para>(1,3,5,4,2)</para></entry></row></tbody></tgroup></informaltable></listitem></itemizedlist><para>と、2回の互換で行うことができました。 </para></section><section><title>偶置換、奇置換</title><para>何回かの互換を繰り返すことで置換ができることがわかりました。 </para><para>上の例では2回の互換で目的の置換ができましたが他の手順も考えられます。 </para><itemizedlist><listitem override="none"><informaltable><tgroup cols="3"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><tbody><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>元の状態</para></entry><entry align="center" colsep="1" rowsep="1"><para>互換</para></entry><entry align="center" colsep="1" rowsep="1"><para>入れ替え後の状態</para></entry></row><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>(1,2,3,4,5)</para></entry><entry align="center" colsep="1" rowsep="1"><para>2と3を入れ替え</para></entry><entry align="center" colsep="1" rowsep="1"><para>(1,3,2,4,5)</para></entry></row><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>(1,3,2,4,5)</para></entry><entry align="center" colsep="1" rowsep="1"><para>2と4を入れ替え</para></entry><entry align="center" colsep="1" rowsep="1"><para>(1,3,4,2,5)</para></entry></row><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>(1,3,4,2,5)</para></entry><entry align="center" colsep="1" rowsep="1"><para>2と5を入れ替え</para></entry><entry align="center" colsep="1" rowsep="1"><para>(1,3,4,5,2)</para></entry></row><row rowsep="1"><entry align="center" colsep="1" rowsep="1"><para>(1,3,4,5,2)</para></entry><entry align="center" colsep="1" rowsep="1"><para>4と5を入れ替え</para></entry><entry align="center" colsep="1" rowsep="1"><para>(1,3,5,4,2)</para></entry></row></tbody></tgroup></informaltable></listitem></itemizedlist><para>4回の互換で行うことができました。 </para><para>ほかにもいろいろな手順が考えられます。 </para><para>しかしどの方法をとっても、 並び(1,2,3,4,5)を並び(1,3,5,4,2)に変えるには 互換の回数は偶数回になります。 </para><itemizedlist><listitem override="none"><para><emphasis role="strong">どんな置換も互換を繰り返すことでできるが、互換の回数は偶数回か奇数回のどちらかに決まる。</emphasis> </para></listitem></itemizedlist><para>奇数回の互換で表される置換を<emphasis role="strong">偶置換</emphasis>といいます。 </para><para>偶数回の互換で表せれる置換を<emphasis role="strong">奇置換</emphasis>といいます。 </para><!--rule (<hr>) is not applicable to DocBook--></section></section><section><title>１５ゲームが解ける条件</title><para>１５ゲームでは 偶置換の問題は解けますが、奇置換の問題は解けません。 </para><para>偶置換の問題だけを作るようにプログラムを作成します。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>プログラム</title><para>最初に正しい位置に配置した後で 互換を偶数回(50回)行うことで問題を作成します。 </para><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[        ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[shokika]]></methodname><![CDATA[()]]>
<![CDATA[        {]]>
<![CDATA[                ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[x]]></methodname><![CDATA[, ]]><methodname><![CDATA[y]]></methodname><![CDATA[, ]]><methodname><![CDATA[x2]]></methodname><![CDATA[, ]]><methodname><![CDATA[y2]]></methodname><![CDATA[, ]]><methodname><![CDATA[w]]></methodname><![CDATA[, ]]><methodname><![CDATA[cnt]]></methodname><![CDATA[;]]>
<![CDATA[                ]]>
<![CDATA[                ]]><token><![CDATA[for]]></token><![CDATA[ (]]><methodname><![CDATA[x]]></methodname><![CDATA[ = 0; ]]><methodname><![CDATA[x]]></methodname><![CDATA[ < 4; ]]><methodname><![CDATA[x]]></methodname><![CDATA[++)]]>
<![CDATA[                        ]]><token><![CDATA[for]]></token><![CDATA[ (]]><methodname><![CDATA[y]]></methodname><![CDATA[ = 0; ]]><methodname><![CDATA[y]]></methodname><![CDATA[ < 4; ]]><methodname><![CDATA[y]]></methodname><![CDATA[++)]]>
<![CDATA[                                ]]><methodname><![CDATA[ban]]></methodname><![CDATA[[]]><methodname><![CDATA[x]]></methodname><![CDATA[][]]><methodname><![CDATA[y]]></methodname><![CDATA[] = ]]><methodname><![CDATA[x]]></methodname><![CDATA[ + ]]><methodname><![CDATA[y]]></methodname><![CDATA[*4;]]>
<![CDATA[                ]]><token><![CDATA[for]]></token><![CDATA[ (]]><methodname><![CDATA[cnt]]></methodname><![CDATA[ = 0; ]]><methodname><![CDATA[cnt]]></methodname><![CDATA[ < 50; ]]><methodname><![CDATA[cnt]]></methodname><![CDATA[++)]]>
<![CDATA[                {]]>
<![CDATA[                        ]]><methodname><![CDATA[x]]></methodname><![CDATA[ = (]]><token><![CDATA[int]]></token><![CDATA[)(]]><methodname><![CDATA[Math]]></methodname><![CDATA[.]]><methodname><![CDATA[random]]></methodname><![CDATA[() * 3);]]>
<![CDATA[                        ]]><methodname><![CDATA[y]]></methodname><![CDATA[ = (]]><token><![CDATA[int]]></token><![CDATA[)(]]><methodname><![CDATA[Math]]></methodname><![CDATA[.]]><methodname><![CDATA[random]]></methodname><![CDATA[() * 3);]]>
<![CDATA[                        ]]><token><![CDATA[if]]></token><![CDATA[(]]><methodname><![CDATA[Math]]></methodname><![CDATA[.]]><methodname><![CDATA[random]]></methodname><![CDATA[() < 0.5)]]>
<![CDATA[                        {]]>
<![CDATA[                                ]]><methodname><![CDATA[x2]]></methodname><![CDATA[ = ]]><methodname><![CDATA[x]]></methodname><![CDATA[;]]>
<![CDATA[                                ]]><methodname><![CDATA[y2]]></methodname><![CDATA[ = ]]><methodname><![CDATA[y]]></methodname><![CDATA[ + 1;]]>
<![CDATA[                        }]]>
<![CDATA[                        ]]><token><![CDATA[else]]></token>
<![CDATA[                        {]]>
<![CDATA[                                ]]><methodname><![CDATA[x2]]></methodname><![CDATA[ = ]]><methodname><![CDATA[x]]></methodname><![CDATA[ + 1;]]>
<![CDATA[                                ]]><methodname><![CDATA[y2]]></methodname><![CDATA[ = ]]><methodname><![CDATA[y]]></methodname><![CDATA[;]]>
<![CDATA[                        }]]>
<![CDATA[                        ]]><methodname><![CDATA[w]]></methodname><![CDATA[ = ]]><methodname><![CDATA[ban]]></methodname><![CDATA[[]]><methodname><![CDATA[x]]></methodname><![CDATA[][]]><methodname><![CDATA[y]]></methodname><![CDATA[];]]>
<![CDATA[                        ]]><methodname><![CDATA[ban]]></methodname><![CDATA[[]]><methodname><![CDATA[x]]></methodname><![CDATA[][]]><methodname><![CDATA[y]]></methodname><![CDATA[] = ]]><methodname><![CDATA[ban]]></methodname><![CDATA[[]]><methodname><![CDATA[x2]]></methodname><![CDATA[][]]><methodname><![CDATA[y2]]></methodname><![CDATA[];]]>
<![CDATA[                        ]]><methodname><![CDATA[ban]]></methodname><![CDATA[[]]><methodname><![CDATA[x2]]></methodname><![CDATA[][]]><methodname><![CDATA[y2]]></methodname><![CDATA[] = ]]><methodname><![CDATA[w]]></methodname><![CDATA[;]]>
<![CDATA[                }]]>
<![CDATA[        }]]>
</programlisting><section><title>プログラムの解説</title><para>５～７行目でもとの配置にしています。。 </para><para>１０～２４行目が１つの互換を行う処理です。 </para><para>その外側のforループを偶数回(50回)繰り返すことで偶置換の問題を作り出しています。 </para><para>１つ１つの互換は ban[x][y]にある内容を、その右隣または直下の内容と入れ替える操作にします。 </para><para>１０，１１行目ではｘとｙの値を乱数で決めています。 乱数は横の数、縦の数より１つ小さい範囲に制限しています。 互換は下図のどれかが行われ、右下のピースの位置だけは変わりません。 </para><para>右下隅のピースはゲーム中は取り除くので、このピースを除いた他のピースの置換(互換)だけを考えなければならないからです。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E8%A7%A3%E3%81%AE%E3%81%82%E3%82%8B%E9%85%8D%E7%BD%AE%E3%82%92%E4%BD%9C%E3%82%8B?action=AttachFile&amp;do=get&amp;target=tikan2.png"/></imageobject><textobject><phrase>tikan2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>１２～２１行目で乱数の値により、x2,y2の位置をx,yの右か下かのどちらかに決めています。 右隣と入れ換えるときは </para><itemizedlist><listitem override="none"><para>x2 = x + 1 </para></listitem><listitem override="none"><para>y2 = y </para></listitem></itemizedlist><para>直下と入れ換えるときは </para><itemizedlist><listitem override="none"><para>x2 = x </para></listitem><listitem override="none"><para>y2 = y + 1 </para></listitem></itemizedlist><para>となっていればよい。 </para><para>２２～２４行目が入れ換えの操作です。 入れ替え元の位置が(x,y)、入れ替え先の位置が(x2,y2)です。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E8%A7%A3%E3%81%AE%E3%81%82%E3%82%8B%E9%85%8D%E7%BD%AE%E3%82%92%E4%BD%9C%E3%82%8B?action=AttachFile&amp;do=get&amp;target=tikan1.png"/></imageobject><textobject><phrase>tikan1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section></section><section><title>演習</title><para>メソッドshokikaを上で示したものに変更し、動作を確認しなさい。 </para></section></section></article>