Advertisement
Guest User

Untitled

a guest
Apr 18th, 2015
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.75 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. /**
  5. * Created by Karolina_2 on 2015-04-12.
  6. */
  7. public class Solver {
  8.  
  9. List<String[]> constraints = new ArrayList<>();
  10.  
  11. static Stack stack;
  12. Solver(){
  13. stack = new Stack();
  14. }
  15.  
  16. public void readFromFile(File file){
  17. try {
  18. Scanner scanner = new Scanner(new FileReader(file));
  19. String[] variables = scanner.nextLine().split(" ");
  20. List<String> vars = Arrays.asList(variables);
  21. List<List<Integer>> domains = new ArrayList<>();
  22. Map<String, List<Integer>> domainsMap = new LinkedHashMap<>();
  23. //List<String[]> constraints = new ArrayList<>();
  24. /*for(int i = 0; i < variables.length; i++){
  25. String[] domainString = scanner.nextLine().split(" ");
  26. List<Integer> domain = new ArrayList<>();
  27. for(int j = 0; j < domainString.length; j++){
  28. domain.add(Integer.parseInt(domainString[j]));
  29. }
  30. domains.add(domain);
  31. }*/
  32. for(int i = 0; i < variables.length; i++){
  33. String[] domainString = scanner.nextLine().split(" ");
  34. List<Integer> domain = new ArrayList<>();
  35. for(int j = 0; j < domainString.length; j++){
  36. domain.add(Integer.parseInt(domainString[j]));
  37. }
  38. domainsMap.put(variables[i], domain);
  39. }
  40. int[] values = new int[variables.length];
  41. List<Integer> vals = new ArrayList<>();
  42. Map<String, Integer> mapa = new LinkedHashMap<>();
  43. for(int i = 0; i < variables.length; i++){
  44. mapa.put("x" + (i+1), -1);
  45. }
  46. System.out.println("Rozmiar mapy: " + mapa.size());
  47. int w = 0;
  48. for(String str : domainsMap.keySet()){
  49. if(domainsMap.get(str).size() == 1){
  50. values[w] = domainsMap.get(str).get(0);
  51. }
  52. else{
  53. values[w] = -1;
  54. }
  55. w++;
  56. }
  57. for(int i = 0; i < values.length; i++){
  58. if(values[i] != -1){
  59. mapa.replace("x" + (i+1), values[i]);
  60. }
  61. }
  62. /*for(String x : mapa.keySet()){
  63. System.out.println("Element: " + (x+1) + " " + mapa.get(x));
  64.  
  65. }*/
  66. for(int i = 0; i < domains.size(); i++){
  67. vals.add(-1);
  68. }
  69. System.out.println(vals.size());
  70. for(int i = 0; i < domains.size(); i++){
  71. if(domains.get(i).size() == 1){
  72. vals.set(i, domains.get(i).get(0));
  73. }
  74. else{
  75. vals.set(i, -1);
  76. }
  77. }
  78. System.out.println();
  79. for(int val : vals){
  80. System.out.print(val + " ");
  81. }
  82. System.out.println();
  83. for(String var : vars){
  84. System.out.print(var + " ");
  85. }
  86. List<String> constraint = new ArrayList<>();
  87. while(scanner.hasNext()){
  88. constraint.add(scanner.nextLine());
  89. }
  90. for(String string : constraint){
  91. String[] strings = string.split(" ");
  92. constraints.add(strings);
  93. }
  94.  
  95. //res = (String)stack.peek();
  96. //System.out.println(res);
  97. System.out.println(constraints.size());
  98. System.out.println(domains.size());
  99. System.out.println(variables.length);
  100. //this.checkCorrectness(constraints, mapa);
  101. System.out.print(this.backtracking(mapa, domainsMap));
  102. for(String var : mapa.keySet()){
  103. System.out.println("Wartosc: " + mapa.get(var));
  104. }
  105. }catch(IOException err){
  106. err.printStackTrace();
  107. }
  108. }
  109.  
  110. private boolean checkCorrectness(List<String[]> constraints, Map<String, Integer> map, String var, int val){
  111. //przejezdzac po kazdym ograniczeniu i sprawdzac, czy spelnione
  112. Map<String, Integer> mapa = new LinkedHashMap<>(map);
  113. mapa.put(var, val);
  114. boolean czySpelnione = true;
  115. for(String[] string : constraints) {
  116. if(czySpelnione) {
  117. String res = "";
  118. for (String string2 : string) {
  119. if (string2.startsWith("x")) {
  120. int x = mapa.get(string2);
  121. stack.push(x);
  122. } else if (isNumber(string2)) {
  123. //int x = Integer.parseInt(string2);
  124. //if(x != -1)
  125. stack.push(string2);
  126. } else if (string2.equals("-") || string2.equals("+") || string2.equals("*") || string2.equals("/")) {
  127. /*String st1 = (String) stack.pop();
  128. String st2 = (String) stack.pop();*/
  129. int x = (int)stack.pop();
  130. int y = (int)stack.pop();
  131. int result;
  132. if(x != -1 && y != -1) {
  133. result = x + y;
  134. //String result = st2 + string2 + st1;
  135. stack.push(result);
  136. }
  137. }else if(string2.equals("==")) {
  138. //System.out.println(result);
  139. System.out.println("Stack size: " + stack.size());
  140. if(stack.size() >= 2)
  141. czySpelnione = Integer.parseInt((String) stack.pop()) == (int) stack.pop();
  142. System.out.println(czySpelnione);
  143. }else if(string2.equals("<>")){
  144. if(stack.size() >= 2)
  145. czySpelnione = Integer.parseInt((String) stack.pop()) != (int) stack.pop();
  146. System.out.println(czySpelnione);
  147. } else if (string2.equals("||")) {
  148. int st;
  149. if(!stack.empty()) {
  150. st = (int) stack.pop();
  151. //String result = "|" + st + "|";
  152. int result = Math.abs(st);
  153. System.out.print(result);
  154. stack.push(result);
  155. }
  156. //System.out.println(result);
  157. } else if (string2.equals("rozne")) {
  158. //List<String> rozne = new ArrayList<>();
  159. //System.out.print(this.czySaRozne(stack));
  160. czySpelnione = this.czySaRozne(stack);
  161. //System.out.println(czySpelnione);
  162. //while (!stack.isEmpty()) {
  163. // rozne.add((String) stack.pop());
  164. //}
  165. /*for (int i = 0; i < rozne.size() - 1; i++) {
  166. for (int j = 0; j < rozne.size() - 1; j++) {
  167. if (i != j && i < j) {
  168. String resu = rozne.get(i) + " != " + rozne.get(j);
  169. //System.out.println(resu);
  170. stack.push(resu);
  171. }
  172. }
  173. }*/
  174. }
  175. }
  176. stack.clear();
  177. }
  178. }
  179. /*for(String[] cons : constraints){
  180. for(String con : cons){
  181. System.out.print(con);
  182. }
  183. System.out.println();
  184. }
  185. for(String var : variables){
  186. System.out.print(var + " ");
  187. }
  188. for(int i : values){
  189. System.out.print(i + " ");
  190. }*/
  191.  
  192. return czySpelnione;
  193. }
  194.  
  195. static boolean isNumber(String string){
  196. if(string.isEmpty()) return false;
  197. for(int i = 0; i < string.length(); i++){
  198. if(!Character.isDigit(string.charAt(i))){
  199. return false;
  200. }
  201. }
  202. return true;
  203. }
  204.  
  205. private boolean czySaRozne(Stack stack){
  206. //System.out.print(stack.pop());
  207. int num = stack.size() - 1;
  208. int[] values = new int[num];
  209. //int size = stack.size();
  210. for(int i = 0; i < num; i++) {
  211. int var = (int)stack.pop();
  212. values[i] = var;
  213. }
  214. for(int i = 0; i < values.length; i++){
  215. for(int j = 0; j < values.length; j++){
  216. if(i != j && values[i] != -1 && values[j] != j){
  217. if(values[i] == values[j]){
  218. return false;
  219. }
  220. }
  221. }
  222. }
  223. return true;
  224. }
  225.  
  226. private boolean backtrack(Map<String, Integer> map, Map<String, List<Integer>> domain, Map<String, List<Integer>> copy){
  227. if(!map.containsValue(-1)) {
  228. return true;
  229. }
  230. String var = this.chooseVar(map);
  231. //System.out.print(var);
  232. List<Integer> varDomain = new ArrayList<>();
  233. //Map<String, List<Integer>> copyOfDomain = this.copyMap(domain);
  234. for(int i = 0; i < domain.get(var).size(); i++){
  235.  
  236. //System.out.print("Poprawnosc: " + this.checkCorrectness(constraints, map, var, domain.get(var).get(i)));
  237. if(this.checkCorrectness(constraints, map, var, domain.get(var).get(i))) {
  238. map.replace(var, domain.get(var).get(i));
  239. varDomain.add(domain.get(var).get(i));
  240. copy.replace(var, varDomain);
  241. //copyOfDomain.replace(var, varDomain);
  242. if (backtrack(map, domain, copy)) {
  243. //jesli trzeba wszystkie rozwiazania, to dodawac do kolekcji, a nie zwracac true
  244. return true;
  245. }
  246. else map.replace(var, -1);
  247.  
  248. //else
  249. // map.replace(var, -1);
  250. }
  251. }
  252. return false;
  253. }
  254.  
  255. private boolean backtracking(Map<String, Integer> map, Map<String, List<Integer>> domain){
  256. //File file = new File("")
  257. if(!map.containsValue(-1)) {
  258. return true;
  259. //if(this.checkCorrectness(constraints, map)) {
  260. // return map;
  261. //}
  262. //else{
  263. // System.out.println("Nie znaleziono poprawnego rozwiązania!");
  264. //return new HashMap<String, Integer>();
  265. //}
  266. //return map;
  267. }
  268. Map<String, List<Integer>> copyOfDomain = this.copyMap(domain);
  269. backtrack(map, domain, copyOfDomain);
  270. /*String var = this.chooseVariable(domain);
  271. System.out.print(var);
  272. List<Integer> varDomain = new ArrayList<>();
  273. //Map<String, List<Integer>> copyOfDomain = this.copyMap(domain);
  274. for(int i = 0; i < domain.get(var).size(); i++){
  275. map.replace(var, domain.get(var).get(i));
  276. System.out.print("Poprawnosc: " + this.checkCorrectness(constraints, map));
  277. if(this.checkCorrectness(constraints, map)) {
  278. varDomain.add(domain.get(var).get(i));
  279. domain.replace(var, varDomain);
  280. //copyOfDomain.replace(var, varDomain);
  281. if (backtracking(map, domain)) {
  282. return true;
  283. }
  284. else map.replace(var, -1);
  285.  
  286. //else
  287. // map.replace(var, -1);
  288. }
  289. }*/
  290. return false;
  291. }
  292.  
  293. private Map<String, List<Integer>> copyMap(Map<String, List<Integer>> original){
  294. Map<String, List<Integer>> resultMap = new LinkedHashMap<>();
  295. for(Map.Entry<String, List<Integer>> entry : original.entrySet()){
  296. resultMap.put(entry.getKey(), new ArrayList<>(entry.getValue()));
  297. }
  298. return resultMap;
  299. }
  300.  
  301. private String chooseVariable(Map<String, List<Integer>> domain){
  302. int size = 999;
  303. String result = "";
  304. for(String var : domain.keySet()){
  305. if(domain.get(var).size() < size && domain.get(var).size() != 1){
  306. size = domain.get(var).size();
  307. result = var;
  308. }
  309. }
  310. return result;
  311. }
  312.  
  313. private String chooseVar(Map<String, Integer> map){
  314. for(String var : map.keySet()){
  315. if(map.get(var) == -1){
  316. return var;
  317. }
  318. }
  319. return "";
  320. }
  321.  
  322. public static void main(String[] args){
  323. Solver solver = new Solver();
  324. solver.readFromFile(new File("sudoku.txt"));
  325. }
  326. }
  327.  
  328. //sudoku 10x10?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement