Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反向魔方';s立方体算法_Java_Android - Fatal编程技术网

Java 反向魔方';s立方体算法

Java 反向魔方';s立方体算法,java,android,Java,Android,我整天都在努力完成这个简单的函数,但我不能让它像我想的那样工作。一开始可能看起来很简单,实际上在Stack Overflow中还有另外一个条目谈到了它。然而,当括号被引入时,事情会变得一团糟。 假设我们可以得到一个Rubiks立方体的算法,它看起来像 (ru'U)U'(ru'R') 重要的是要注意,在每次移动之后,无论是否有“'”符号,都会有一个空格,除了结束括号之前的空格。 现在,对于魔方上的每一个算法,都存在它的逆运算,即撤销它的逆运算。例如,R的逆是R',U的逆是U,ru的逆是U'R'。因

我整天都在努力完成这个简单的函数,但我不能让它像我想的那样工作。一开始可能看起来很简单,实际上在Stack Overflow中还有另外一个条目谈到了它。然而,当括号被引入时,事情会变得一团糟。 假设我们可以得到一个Rubiks立方体的算法,它看起来像 (ru'U)U'(ru'R') 重要的是要注意,在每次移动之后,无论是否有“'”符号,都会有一个空格,除了结束括号之前的空格。 现在,对于魔方上的每一个算法,都存在它的逆运算,即撤销它的逆运算。例如,R的逆是R',U的逆是U,ru的逆是U'R'。因此,该示例的反例是: (ru)(U"ru") 还有一点很重要,就是有很多动作(F,B,D,U,U,F,M,S,x,y,z…) 此外,每个alg都有自己的逆(R有R’,反之亦然, 你能用Java来实现这个功能吗? 我尝试了无限循环的ifelse,例如,开关。。。 我将留下我的一些尝试仅供参考


        String fullAlg = text.toString() + " ";
        String reversedAlg = "hh";
        int numSpaces = 1;
        int pos1 = 0, pos2 = 0;
        for (int i = 0; i < text.length(); i++) {
            if (text.charAt(i) == ' ' && numSpaces == 0) {
                numSpaces++;
                pos1 = i;
            }

            if (text.charAt(i) == ' ' && numSpaces == 1) {
                numSpaces++;
                pos2 = i;
            }
            if (numSpaces == 2) {
                if (fullAlg.substring(pos1, pos2).matches("[a-zA-Z]+")){
                    Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show();
                }
                switch (fullAlg.substring(pos1, pos2)) {

                    //Begin with (
                    case "(" + "[a-zA-Z]+":
                        reversedAlg += ")'" + fullAlg.substring(pos1, pos2).charAt(1);
                        break;
                    case "(" + "[a-zA-Z]+" + "\'":
                        reversedAlg += ")" + fullAlg.substring(pos1, pos2).charAt(1);
                        break;
                    case "(" + "[a-zA-Z]+" + "2":
                        reversedAlg += ")2" + fullAlg.substring(pos1, pos2).charAt(1);
                        break;

                    //No ()
                    case "[a-zA-Z]+":
                        reversedAlg += " '" + fullAlg.substring(pos1, pos2).charAt(0);
                        break;
                    case "[a-zA-Z]+" + "\'":
                        reversedAlg += " '" + fullAlg.substring(pos1, pos2).charAt(0);
                        break;
                    case "[a-zA-Z]+" + "2":
                        reversedAlg += " 2" + fullAlg.substring(pos1, pos2).charAt(0);
                        break;

                    //End with )
                    case "[a-zA-Z]+" + ")":
                        reversedAlg += " '" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
                        break;
                    case "[a-zA-Z]+" + "\'" + ")":
                        reversedAlg += " " + fullAlg.substring(pos1, pos2).charAt(1) + "(";
                        break;
                    case "[a-zA-Z]+" + "2" + ")":
                        reversedAlg += " )2" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
                        break;

                    //Encapsulated in ()
                    case "(" + "[a-zA-Z]+" + ")":
                        reversedAlg += " )'" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
                        break;
                    case "(" + "[a-zA-Z]+" + "\'" + ")":
                        reversedAlg += " )" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
                        break;
                    case "(" + "[a-zA-Z]+" + "2" + ")":
                        reversedAlg += " )2" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
                        break;
                }
                numSpaces = 0;
            }
        }

        StringBuilder returnAlg = new StringBuilder(reversedAlg).reverse();
        algTV.setText(fullAlg.substring(pos1, pos2));

    }

字符串fullAlg=text.toString()+“”;
字符串反转dalg=“hh”;
int numSpaces=1;
int pos1=0,pos2=0;
对于(int i=0;i
还是这个


        String fullAlg = text.toString();
        String fullAldReversed = "";
        int posStart = 0, posEnd = 0;
        for (int i = 0; i < fullAlg.length(); i++) {
            if (fullAlg.charAt(i) == '('){
                posStart = i;
            } else if (fullAlg.charAt(i) == ')'){
                posEnd = i;
                fullAldReversed += "(" + reverseAlg(fullAlg.substring(posStart, posEnd)) + ")";
                posStart = 0;
            }
        }
        if (posEnd == 0){
            fullAldReversed = "" + reverseAlg(fullAlg);
        }
        algTV.setText(fullAldReversed);
    }

    private StringBuilder reverseAlg(CharSequence text) {

        StringBuilder builder;
        if (!(text.charAt(0) == ' ' || text.charAt(text.length() - 1) == ' ')) {
            builder = new StringBuilder(text + " ");
        } else {
            builder = new StringBuilder(text);
        }
        int subStart = 0;
        StringBuilder auxBuilder;
        String substring = "", auxString = "";
        for (int i = 0; i < builder.length(); i++) {
            substring = "";
                int subEnd = i;
                int identifierMove = 0;
                for (int j = subStart; j <= subEnd; j++) {
                    if (builder.charAt(j) == '\'')
                        identifierMove = 1;
                    else if (builder.charAt(j) == '2')
                        identifierMove = 2;
                    else if (identifierMove == 0)
                        identifierMove = 3;
                }

                String letterMove;

                switch (identifierMove) {
                    case 1:
                        letterMove = builder.substring(subStart, subEnd - 1);
                        subStart = subEnd + 1;
                        substring = " " + letterMove;
                        break;
                    case 2:
                        letterMove = builder.substring(subStart, subEnd - 1);
                        subStart = subEnd + 1;
                        substring = " 2" + letterMove;
                        break;
                    case 3:
                        letterMove = builder.substring(subStart, subEnd);
                        subStart = subEnd + 1;
                        substring = " '" + letterMove;
                        break;
                }
            auxString += substring;
        }

        auxBuilder = new StringBuilder(auxString);
        auxBuilder.reverse().toString();
        return auxBuilder;
    }

String fullAlg=text.toString();
字符串fullAldReversed=“”;
int posStart=0,posEnd=0;
对于(int i=0;i对于(int j=subStart;j很抱歉耽搁了您的时间!在我看来,您的尝试过于复杂了。我认为创建一个类来表示Rubix多维数据集算法是最好的选择,因为它有点复杂,而且该类还将留有进一步扩展的空间。无论如何,它的工作方式很简单。类构造函数需要一个字符串作为输入,将文本转换为整数以便于存储和操作。从这里开始,反转算法非常简单!您所要做的就是反转数组的顺序并将所有整数乘以-1!(它们的相反方向)
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;

public class Rubiks
{
  public static void main(String[] args)
  {
    // (R U R' U) U' (R U' R')
    Instruction g1 = new Algorithm(Move.fore('R'), Move.fore('U'), Move.back('R'), Move.back('U'));
    Instruction g2 = new Algorithm(Move.fore('R'), Move.back('U'), Move.back('R'));
    Instruction full = new Algorithm(g1, Move.back('U'), g2);
    System.out.println("This algorithm: " + full);
    System.out.println("Inverts to be:  " + full.inverted());
  }
}

class Move implements Instruction
{
  private final char side;
  private final boolean inverse;

  private Move(final char side, final boolean inverse)
  {
    this.side = side;
    this.inverse = inverse;
  }

  public static Move fore(final char side)
  {
    return new Move(side, false);
  }
  public static Move back(final char side)
  {
    return new Move(side, true);
  }

  public Move inverted()
  {
    return new Move(side, !inverse);
  }

  @Override
  public String toString()
  {
    return side + (inverse ? "'" : "");
  }

  @Override
  public String toSubString()
  {
    return toString();
  }
}

class Algorithm implements Instruction
{
  private final Deque<Instruction> moves;

  private Algorithm(Deque<Instruction> moves)
  {
    this.moves = moves;
  }

  public Algorithm(Instruction... moves)
  {
    this.moves = new ArrayDeque<>(Arrays.asList(moves));
  }

  public Algorithm inverted()
  {
    Deque<Instruction> newMoves = new ArrayDeque<>(moves.size());
    for (Instruction instruction : (Iterable<Instruction>) moves::descendingIterator)
    {
      newMoves.add(instruction.inverted());
    }
    return new Algorithm(newMoves);
  }

  @Override
  public String toString()
  {
    StringBuilder sb = new StringBuilder();
    boolean first = true;
    for (Instruction instruction : moves)
    {
      if(! first)
      {
        sb.append(' ');
      }
      first = false;
      sb.append(instruction.toSubString());
    }
    return sb.toString();
  }
}

interface Instruction
{
  /**
   * Returns the inverse of this instruction
   * @return an instruction that undoes this instruction
   */
  Instruction inverted();

  /**
   * Returns the string representation of the instruction, if it were nested in another instruction
   * @return the result of toString, with parentheses if this is a complex instruction
   */
  default String toSubString()
  {
    return "(" + toString() + ")";
  }
}
This algorithm: (R U R' U') U' (R U' R')
Inverts to be:  (R U R') U (U R U' R')
private void reverseAlg(CharSequence text) {
        StringBuilder fullAlg;
        if (!(text.charAt(0) == ' ' || text.charAt(text.length() - 1) == ' ')) {
            fullAlg = new StringBuilder(text + " ");
        } else {
            fullAlg = new StringBuilder(text);
        }
        StringBuilder reversedAlg = new StringBuilder();
        for (int i = 0; i < text.length(); i++) {
            if (fullAlg.charAt(i) != '(' && fullAlg.charAt(i) != ')' && fullAlg.charAt(i) != ' '
                    && fullAlg.charAt(i) != '\'' && fullAlg.charAt(i) != '2') {

                if (fullAlg.charAt(i + 1) == '\'') {

                    if (fullAlg.charAt(i + 2) == ')') {
                        reversedAlg.append(fullAlg.charAt(i)).append(")");
                    } else {
                        reversedAlg.append(fullAlg.charAt(i));
                    }

                } else if (fullAlg.charAt(i + 1) == ' ') {

                    reversedAlg.append("\'").append(fullAlg.charAt(i));

                } else if (fullAlg.charAt(i + 1) == '2') {

                    if (fullAlg.charAt(i + 2) == ')') {
                        reversedAlg.append("2").append(fullAlg.charAt(i)).append(")");
                    } else {
                        reversedAlg.append("2").append(fullAlg.charAt(i));
                    }

                } else if (fullAlg.charAt(i + 1) == ')') {

                    reversedAlg.append("\'").append(fullAlg.charAt(i)).append(")");

                }

            } else if (fullAlg.charAt(i) == ' ' || fullAlg.charAt(i) == '(') {
                reversedAlg.append(fullAlg.charAt(i));
            }
        }

        StringBuilder aux = new StringBuilder(reversedAlg.toString()).reverse();
        for (int i = 0; i < aux.length(); i++) {
            if (aux.charAt(i) == '(') {
                aux.setCharAt(i, ')');
            } else if (aux.charAt(i) == ')') {
                aux.setCharAt(i, '(');
            }
        }
        algTV.setText(aux);
    }