Advertisement
finalmail

asd

Nov 3rd, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const readline = require("readline").createInterface({
  2.   input: process.stdin,
  3.   output: process.stdout
  4. });
  5.  
  6. let N = 10000;
  7. let board = [];
  8. let queensByRow = [];
  9. let queensByMinorDiagonal = [];
  10. let queensByMajorDiagonal = [];
  11.  
  12. const getRandomInt = max => Math.floor(Math.random() * Math.floor(max));
  13.  
  14. const generateBoard = () => {
  15.   board = [];
  16.   queensByRow = [];
  17.   queensByMinorDiagonal = [];
  18.   queensByMajorDiagonal = [];
  19.  
  20.   for (let i = 0; i < N; i++) {
  21.     board.push(i);
  22.     queensByRow.push(0);
  23.   }
  24.   for (let i = 0; i < 2 * N; i++) {
  25.     queensByMinorDiagonal.push(0);
  26.     queensByMajorDiagonal.push(0);
  27.   }
  28.  
  29.   for (let i = 0; i < N; i++) {
  30.     const ind = getRandomInt(N);
  31.     const temp = board[i];
  32.     board[i] = board[ind];
  33.     board[ind] = temp;
  34.   }
  35.   for (let i = 0; i < N; i++) {
  36.     const queenRow = board[i];
  37.     queensByRow[queenRow]++;
  38.     queensByMinorDiagonal[queenRow + i]++;
  39.     queensByMajorDiagonal[N - queenRow - 1 + i]++;
  40.   }
  41. };
  42.  
  43. const getConflictCount = (row, col, hasQueenOnCell) =>
  44.   queensByRow[row] +
  45.   queensByMinorDiagonal[row + col] +
  46.   queensByMajorDiagonal[N - row - 1 + col] -
  47.   (hasQueenOnCell ? 3 : 0);
  48.  
  49. const solve = () => {
  50.   const MAX_STEPS = 2 * N;
  51.   let step = 0;
  52.   let candidates = [];
  53.  
  54.   while (step++ < MAX_STEPS) {
  55.     let maxConflicts = 0;
  56.     candidates = [];
  57.  
  58.     for (let c = 0; c < board.length; c++) {
  59.       let conflicts = getConflictCount(board[c], c, true);
  60.  
  61.       if (conflicts === maxConflicts) {
  62.         candidates.push(c);
  63.       } else if (conflicts > maxConflicts) {
  64.         maxConflicts = conflicts;
  65.         candidates = [c];
  66.       }
  67.     }
  68.  
  69.     if (maxConflicts === 0) {
  70.       return true;
  71.     }
  72.     const worstQueenColumn = candidates[getRandomInt(candidates.length)];
  73.     let minConflicts = N;
  74.     candidates = [];
  75.     for (let r = 0; r < board.length; r++) {
  76.       let conflicts = getConflictCount(
  77.         r,
  78.         worstQueenColumn,
  79.         board[worstQueenColumn] === r
  80.       );
  81.       if (conflicts === minConflicts) {
  82.         candidates.push(r);
  83.       } else if (conflicts < minConflicts) {
  84.         minConflicts = conflicts;
  85.         candidates = [r];
  86.       }
  87.     }
  88.  
  89.     if (candidates.length > 0) {
  90.       const newRow = candidates[getRandomInt(candidates.length)];
  91.       const oldRow = board[worstQueenColumn];
  92.       board[worstQueenColumn] = newRow;
  93.  
  94.       queensByRow[oldRow]--;
  95.       queensByRow[newRow]++;
  96.       queensByMinorDiagonal[oldRow + worstQueenColumn]--;
  97.       queensByMinorDiagonal[newRow + worstQueenColumn]++;
  98.       queensByMajorDiagonal[N - oldRow - 1 + worstQueenColumn]--;
  99.       queensByMajorDiagonal[N - newRow - 1 + worstQueenColumn]++;
  100.     }
  101.   }
  102.  
  103.   return false;
  104. };
  105.  
  106. const main = () => {
  107.   console.time("l");
  108.   while (true) {
  109.     generateBoard();
  110.     if (solve()) {
  111.       break;
  112.     }
  113.   }
  114.   console.timeEnd("l");
  115.   console.log("end");
  116. };
  117.  
  118. readline.on("line", line => {
  119.   N = Number(line);
  120.   main();
  121.   readline.close();
  122. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement