Advertisement
Guest User

Untitled

a guest
Apr 25th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.19 KB | None | 0 0
  1. package si.sudoku;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import sac.graph.AStar;
  6. import sac.graph.BestFirstSearch;
  7. import sac.graph.GraphSearchAlgorithm;
  8. import sac.graph.GraphSearchConfigurator;
  9. import sac.graph.GraphState;
  10. import sac.graph.GraphStateImpl;
  11.  
  12. public class Sudoku extends GraphStateImpl{
  13. public static int n=3;
  14. public static int n2=n*n;
  15. private byte[][] board=null;
  16. public int zeros=n2*n2;
  17.  
  18. public Sudoku() {
  19. board=new byte[n2][n2];
  20. for(int i=0;i<n2;i++){
  21. for(int j=0;j<n2;j++){
  22. board[i][j]=0;
  23. }
  24. }
  25. }
  26.  
  27. public Sudoku(Sudoku parent) {
  28. board=new byte[n2][n2];
  29. for(int i=0;i<n2;i++){
  30. for(int j=0;j<n2;j++){
  31. board[i][j]=parent.board[i][j];
  32. }
  33. }
  34. zeros=parent.zeros;
  35. }
  36.  
  37. private void refreshZeros() {
  38. zeros=0;
  39. for(int i=0;i<n2;i++){
  40. for(int j=0;j<n2;j++){
  41. if(board[i][j]==0) {
  42. zeros++;
  43. }
  44. }
  45. }
  46. }
  47.  
  48. @Override
  49. public String toString() {
  50. String txt="";
  51. for(int i=0;i<n2;i++){
  52. for(int j=0;j<n2;j++){
  53. txt+=board[i][j];
  54. if (j==8){
  55. txt+="\n";
  56. }
  57. else {
  58. txt+=",";
  59. }
  60. }
  61. }
  62. return txt;
  63. }
  64.  
  65.  
  66. public void fromStringN3(String txt)
  67. {
  68. int k=0;
  69. for(int i=0;i<n2;i++){
  70. for(int j=0;j<n2;j++){
  71. board[i][j]=Byte.valueOf(txt.substring(k,k+1));
  72. k++;
  73. }
  74. }
  75. refreshZeros();
  76. }
  77.  
  78. public boolean isLegal()
  79. {
  80. byte[] group = new byte[n2];
  81. for(int i=0;i<n2;i++){
  82. for(int j=0;j<n2;j++){
  83. group[j]=board[i][j];
  84. }
  85. if(!isGroupLegal(group)) {
  86. return false;
  87. }
  88. }
  89.  
  90. for(int i=0;i<n2;i++){
  91. for(int j=0;j<n2;j++){
  92. group[j]=board[j][i];
  93. }
  94. if(!isGroupLegal(group)) {
  95. return false;
  96. }
  97. }
  98.  
  99. for(int i=0;i<n;i++){
  100. for(int j=0;j<n;j++){
  101. int q = 0;
  102. for(int k=0;k<n;k++){
  103. for(int l=0;l<n;l++){
  104. group[q++] = board[i*n+k][j*n+l];
  105. }
  106. }
  107. if(!isGroupLegal(group)) {
  108. return false;
  109. }
  110. }
  111. }
  112.  
  113. return true;
  114. }
  115.  
  116.  
  117. private boolean isGroupLegal(byte[] group)
  118. {
  119. boolean[] visited = new boolean[n2];
  120. for(int i=0;i<n2;i++){
  121. visited[i] = false;
  122. }
  123.  
  124. for(int i=0;i<n2;i++){
  125. if(group[i]==0)
  126. {
  127. continue;
  128. }
  129. if(visited[group[i]-1])
  130. {
  131. return false;
  132. }
  133. visited[group[i] - 1] = true;
  134. }
  135. return true;
  136. }
  137.  
  138.  
  139. @Override
  140. public List<GraphState> generateChildren() {
  141. List<GraphState> children = new ArrayList<GraphState>();
  142.  
  143. int i=0, j = 0;
  144.  
  145. zeroFound:
  146. for(i=0;i<n2;i++) {
  147. for(j=0;j<n2;j++) {
  148. if(board[i][j]==0) {
  149. break zeroFound;
  150. }
  151. }
  152. }
  153.  
  154. if(i==n2) {
  155. return children;
  156. }
  157.  
  158. for(int k=0;k<n2;k++) {
  159. Sudoku child=new Sudoku(this);
  160. child.board[i][j]=(byte) (k+1);
  161. if(child.isLegal()) {
  162. children.add(child);
  163. child.zeros--;
  164. }
  165. }
  166.  
  167. return children;
  168. }
  169.  
  170.  
  171. @Override
  172. public int hashCode() {
  173. // TODO Auto-generated method stub
  174. //return super.hashCode();
  175. return toString().hashCode();
  176. }
  177.  
  178. @Override
  179. public boolean isSolution() {
  180. return ((zeros==0)&&(isLegal()));
  181. }
  182.  
  183. public static void main(String[] args){
  184. Sudoku s=new Sudoku();
  185.  
  186. //String sudoku= "003020600900305001001806400008102900700000008006708200002609500800203009005010300"; //poprawne
  187. String sudoku= "000000600900305001001806400008102900700000008006708200002609500800203009005010300";
  188. s.fromStringN3(sudoku);
  189. System.out.println(s);
  190.  
  191. Sudoku.setHFunction(new HEmptyPlaces());
  192. GraphSearchConfigurator conf = new GraphSearchConfigurator();
  193. conf.setWantedNumberOfSolutions(Integer.MAX_VALUE);
  194. GraphSearchAlgorithm i = new BestFirstSearch(s,conf);
  195. i.execute();
  196. List<GraphState> solutions = i.getSolutions();
  197.  
  198. for(GraphState sol : solutions) {
  199. System.out.println(sol);
  200. System.out.println("--------");
  201. }
  202. System.out.println("Time:" + i.getDurationTime());
  203. System.out.println("Closed:" + i.getClosedStatesCount());
  204. System.out.println("Open:" + i.getOpenSet().size());
  205. System.out.println("Open:" + i.getSolutions().size());
  206. }
  207.  
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement