Я новичок в разработке 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);
}
}