滑块拼图吧 关注:78贴子:389
  • 6回复贴,共1

确定你的滑块拼图是否可还原的一种方法

只看楼主收藏回复

根据逆序数的原理自己做了一个网页

地址是 https://xyqlx.gitee.io/func/2018/12/13/puzzle.html
网页可以保存到本地运行


IP属地:广东1楼2018-12-14 23:52回复
    如果有什么错误请联系我


    IP属地:广东2楼2018-12-14 23:55
    回复
      挖帖。
      个人觉得用逆序数判断不妥,用逆序数判断出不可复原的一定不可复原,但用逆序数判断出可以复原的也未必能够复原。
      如有不对还请指教。


      IP属地:北京3楼2019-01-05 20:45
      回复(2)
        挖一下坟,三阶也是不行的,在使用逆序数判断的时候,要跳过空位,在操作上就是空白为0的时候在正常算出逆序后减去0所在的元素下标,我举个例子,这个序列(9为空白)你的函数判断是可以复原的,实际上是不可以的,不信你可以试一试,顺便贴一下我自己的代码(C++,空白为0)


        星座王
        点亮12星座印记,去领取
        活动截止:2100-01-01
        去徽章馆》
        IP属地:上海4楼2020-03-12 22:42
        回复
          图片好像看得不太清楚,直接贴上来吧,不过格式就不太好看了,顺便说一下我这里是不能还原的返回true
          //判断随机生成的数组逆序数是否为偶数,是否需要重新生成
          bool Puzzle::Judge(const int* state)
          {
          int inver_n = state[0];//设定逆序数变量并初始为首元素
          int index_zero = 0;//记录空白方块的下标
          for (int index = 1, tmp; index < 9; index++)
          {
          if (!state[index])
          {
          index_zero = index;
          continue;
          }
          if (index < 5)
          {
          tmp = state[index];
          for (int i = index - 1; i >= 0 && tmp; i--)
          {
          if (state[i] < state[index])
          {
          tmp--;
          }
          }
          }
          else
          {
          tmp = 0;
          for (int i = index + 1; i < 9 && tmp <= state[index]; i++)
          {
          if (state[i] < state[index])
          {
          tmp++;
          }
          }
          }
          inver_n += tmp;
          }
          inver_n -= index_zero;
          return inver_n % 2;
          }


          星座王
          点亮12星座印记,去领取
          活动截止:2100-01-01
          去徽章馆》
          IP属地:上海5楼2020-03-12 22:44
          回复