Android Приложение показывает неправильный вывод после второго запуска - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в разработке Android, и я сделал приложение для решения головоломки судоку. Всякий раз, когда я заново устанавливаю приложение или принудительно останавливаю приложение и запускаю его снова, оно работает нормально. Но если я попытаюсь запустить приложение еще раз, не останавливая его, оно выдаст неверный результат. Вот мой код

public class MainActivity extends AppCompatActivity {
    EditText[] arr=new EditText[9];
    Button submitButton;
    char[][] board;
    TextView[] ret=new TextView[9];
    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        arr[0]=(EditText)findViewById(R.id.e1);
        arr[1]=(EditText)findViewById(R.id.e2);
        arr[2]=(EditText)findViewById(R.id.e3);
        arr[3]=(EditText)findViewById(R.id.e4);
        arr[4]=(EditText)findViewById(R.id.e5);
        arr[5]=(EditText)findViewById(R.id.e6);
        arr[6]=(EditText)findViewById(R.id.e7);
        arr[7]=(EditText)findViewById(R.id.e8);
        arr[8]=(EditText)findViewById(R.id.e9);
        ret[0]=(TextView)findViewById(R.id.o1);
        ret[1]=(TextView)findViewById(R.id.o2);
        ret[2]=(TextView)findViewById(R.id.o3);
        ret[3]=(TextView)findViewById(R.id.o4);
        ret[4]=(TextView)findViewById(R.id.o5);
        ret[5]=(TextView)findViewById(R.id.o6);
        ret[6]=(TextView)findViewById(R.id.o7);
        ret[7]=(TextView)findViewById(R.id.o8);
        ret[8]=(TextView)findViewById(R.id.o9);
        board=new char[9][0];
        submitButton=(Button)findViewById(R.id.submit_button);
        submitButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                for(int i=0;i<9;++i)
                    board[i]=arr[i].getText().toString().toCharArray();
                Solve.solveSudoku(board);
                for(int i=0;i<9;++i)
                    ret[i].setText(new String(board[i]));
            }
        });
    }
}

logi c решения - это алгоритм поиска с возвратом, который проверяет все возможные числа для определенного поля в сетке. Вот код для этого:

package com.example.sudokusolver;

public class Solve {

    public static boolean flag =false;
    public static void dfs(int k,int[][] arr,int[] r,int[] c,int[] box,int count,char [][] board,int[][] index)
    {
        if(k==count)
            flag=true;
        else
        {
            int i=arr[k][0],j=arr[k][1];
            for(int n=0;n<9;++n)
            {
                int val=1<<n;
                if(((r[i]&val)==0)&&((c[j]&val)==0)&&((box[index[i][j]]&val)==0))
                {
                    r[i]|=val;
                    c[j]|=val;
                    box[index[i][j]]|=val;
                    board[i][j]=(char)('1'+n);
                    dfs(k+1,arr,r,c,box,count,board,index);
                    if(flag)
                        return;
                    r[i]&=~(val);
                    c[j]&=~(val);
                    box[index[i][j]]&=~(val);
                }
            }
        }
    }
    public static void solveSudoku(char[][] board)
    {
        int [][] index=new int[9][9];
        int[] dx= new int[] {0,3,6};
        int count=0;
        for(int r:dx)
            for(int c:dx)
            {
                for(int i=0;i<3;++i)
                    for(int j=0;j<3;++j)
                        index[r+i][c+j]=count;
                ++count;
            }
        int[] r=new int[9];
        int[] c=new int[9];
        int[] box=new int[9];
        int[][] arr=new int[81][0];
        count=0;
        for(int i=0;i<9;++i)
            for(int j=0;j<9;++j)
                if(board[i][j]!='0')
                {
                    int val=1<<(board[i][j]-'1');
                    r[i]=r[i]|val;
                    box[index[i][j]]=box[index[i][j]]|val;
                    c[j]=c[j]|val;
                }
                else
                    arr[count++]=new int[]{i,j};
        dfs(0,arr,r,c,box,count,board,index);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...