Guest User

Untitled

a guest
Feb 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 KB | None | 0 0
  1. :reset
  2. import jp.kobe_u.scarab._ , dsl._
  3.  
  4. var board = Array.ofDim[Int](11,11);
  5. var numOfLights = Array.ofDim[Int](11,11);
  6. // 黒マスの設定 //
  7. board(2)(2) = 1;
  8. board(2)(3) = 1;
  9. board(2)(4) = 1;
  10. board(2)(5) = 1;
  11. board(2)(8) = 1;
  12. board(2)(9) = 1;
  13. board(3)(2) = 1;
  14. board(4)(4) = 1;
  15. board(4)(5) = 1;
  16. board(4)(7) = 1;
  17. board(5)(2) = 1;
  18. board(5)(4) = 1;
  19. board(5)(7) = 1;
  20. board(5)(9) = 1;
  21. board(6)(2) = 1;
  22. board(6)(4) = 1;
  23. board(6)(7) = 1;
  24. board(6)(9) = 1;
  25. board(7)(4) = 1;
  26. board(7)(6) = 1;
  27. board(7)(7) = 1;
  28. board(8)(9) = 1;
  29. board(9)(2) = 1;
  30. board(9)(3) = 1;
  31. board(9)(6) = 1;
  32. board(9)(7) = 1;
  33. board(9)(8) = 1;
  34. board(9)(9) = 1;
  35.  
  36. // 照明の数の設定 //
  37. numOfLights(2)(2) = 2;
  38. numOfLights(2)(3) = -1;
  39. numOfLights(2)(4) = -1;
  40. numOfLights(2)(5) = 1;
  41. numOfLights(2)(8) = 1;
  42. numOfLights(2)(9) = -1;
  43. numOfLights(3)(2) = -1;
  44. numOfLights(4)(4) = -1;
  45. numOfLights(4)(5) = 1;
  46. numOfLights(4)(7) = -1;
  47. numOfLights(5)(2) = -1;
  48. numOfLights(5)(4) = 1;
  49. numOfLights(5)(7) = -1;
  50. numOfLights(5)(9) = 0;
  51. numOfLights(6)(2) = 0;
  52. numOfLights(6)(4) = -1;
  53. numOfLights(6)(7) = -1;
  54. numOfLights(6)(9) = -1;
  55. numOfLights(7)(4) = 1;
  56. numOfLights(7)(6) = 1;
  57. numOfLights(7)(7) = 1;
  58. numOfLights(8)(9) = -1;
  59. numOfLights(9)(2) = -1;
  60. numOfLights(9)(3) = -1;
  61. numOfLights(9)(6) = 1;
  62. numOfLights(9)(7) = 0;
  63. numOfLights(9)(8) = -1;
  64. numOfLights(9)(9) = -1;
  65.  
  66. def printSolution(brd : Array[Array[Int]], lig : Array[Array[Int]], sol : Assignment = null) {
  67. var image = Array.fill[Char](10*3, 10*3) { ' ' };
  68. for (i <- 1 to 10; j <- 1 to 10) {
  69. val x = (i-1) * 3 + 1;
  70. val y = (j-1) * 3 + 1;
  71. if (brd(i)(j) != 0) image(x)(y) = (brd(i)(j) + '0').toChar; else image(x)(y) = '.';
  72. if (sol != null) {
  73. if (brd(i)(j) == 1) image(x)(y) = '@'; //黒マス
  74. if (sol('x(i,j)) == 1) image(x)(y) = 'O'; //照明
  75. }
  76. else if (brd(i)(j) == 1) image(x)(y) = '@'; //黒マス
  77. }
  78. for (i <- 1 to 10 * 3) {
  79. for (j <- 1 to 10 * 3)
  80. print(s"${image(i-1)(j-1)} ");
  81. println();
  82. }
  83. }
  84.  
  85. // 変数の定義
  86. for (i <- 1 to 10; j <- 1 to 10){
  87. int('x(i,j), 0, 1); // 照明が置かれているかどうか
  88. }
  89.  
  90. // 制約の追加
  91. for (i <- 1 to 10; j <- 1 to 10) {
  92.  
  93. var lights : Seq[Var] = Seq();
  94. if (board(i)(j) == 1) add('x(i,j) === 0) // 黒マスには照明を置かない
  95.  
  96.  
  97. // 黒マスの周りに置く照明の制約
  98. if (board(i)(j) == 1){ // 注目マスが黒マスである
  99. if(i - 1 >= 1) lights = lights :+ 'x(i-1,j);
  100. if(i + 1 <= 10) lights = lights :+ 'x(i+1,j);
  101. if(j - 1 >= 1) lights = lights :+ 'x(i,j-1);
  102. if(j + 1 <= 10) lights = lights :+ 'x(i,j+1);
  103. if(numOfLights(i)(j) == 0) add(Sum(lights) === 0);
  104. if(numOfLights(i)(j) == 1) add(Sum(lights) === 1);
  105. if(numOfLights(i)(j) == 2) add(Sum(lights) === 2);
  106. if(numOfLights(i)(j) == 3) add(Sum(lights) === 3);
  107. if(numOfLights(i)(j) == 4) add(Sum(lights) === 4);
  108. }
  109.  
  110. // 照明があるマスは他の照明に照らされてはいけない制約 and 全ての白マスが照らされているという制約
  111. if (board(i)(j) == 0){ //注目マスが黒マスではない
  112. var check : Seq[Var] = Seq();
  113. check = check :+ 'x(i,j); //注目マスは最初に入れる
  114.  
  115. // 上方向の走査(iは定数,jが変数)
  116. var loop: Boolean = true;
  117. var k: Int = j - 1;
  118. while(loop){
  119. if(k == 0) loop = false;
  120. else if(board(i)(k) == 1) loop = false;
  121. else if (board(i)(k) == 0) check = check :+ 'x(i,k);
  122. k = k - 1;
  123. }
  124.  
  125. // 下方向の走査(iは定数,jが変数)
  126. loop = true;
  127. k = j + 1;
  128. while(loop){
  129. if((k == 11)) loop = false;
  130. else if(board(i)(k) == 1) loop = false;
  131. else if (board(i)(k) == 0) check = check :+ 'x(i,k);
  132. k = k + 1;
  133. }
  134.  
  135. // 左方向の走査(iは変数,jが定数)
  136. loop = true;
  137. k = i - 1;
  138. while(loop){
  139. if(k == 0) loop = false;
  140. else if(board(k)(j) == 1) loop = false;
  141. else if (board(k)(j) == 0) check = check :+ 'x(k,j);
  142. k = k - 1;
  143. }
  144.  
  145. // 右方向の走査(iは定数,jが変数)
  146. loop = true;
  147. k = i + 1;
  148. while(loop){
  149. if(k == 11) loop = false;
  150. else if(board(k)(j) == 1) loop = false;
  151. else if (board(k)(j) == 0) check = check :+ 'x(k,j);
  152. k = k + 1;
  153. }
  154. add(!('x(i,j) === 1) || (Sum(check) <= 1)); // 照明から黒マスまたは外枠になるまでに照らされるマスの中に含まれる照明の数は1つであればいい
  155. if (board(i)(j) == 0) add(Sum(check) >= 1); // 全マスが照らされていなければならない
  156. }
  157. }
  158.  
  159. println("求解前")
  160. // 求解前の盤面を表示
  161. printSolution(board, numOfLights, solution)
  162.  
  163. find;
  164.  
  165. println("求解後")
  166. // 求解後の盤面を表示
  167. printSolution(board, numOfLights, solution);
Add Comment
Please, Sign In to add comment