Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const N = 500;
- let board = [];
- const toZero = _ => 0;
- const getRandomInt = max => Math.floor(Math.random() * Math.floor(max));
- const generateBoard = () => {
- const newBoard = [];
- for (let i = 0; i < N; i++) {
- newBoard.push(i);
- }
- for (let i = 0; i < N; i++) {
- const ind = getRandomInt(N);
- const temp = newBoard[i];
- newBoard[i] = newBoard[ind];
- newBoard[ind] = temp;
- }
- return newBoard;
- };
- const getConflicts = () => {
- let conflictCount = 0;
- let conflicts = board.map(toZero);
- for (let i = 0; i < N - 1; i++) {
- for (let j = i + 1; j < N; j++) {
- if (board[i] === board[j]) {
- conflicts[i]++;
- conflicts[j]++;
- conflictCount++;
- } else if (Math.abs(board[i] - board[j]) === Math.abs(i - j)) {
- conflicts[i]++;
- conflicts[j]++;
- conflictCount++;
- }
- }
- }
- return [conflictCount, conflicts];
- };
- const pickRandomConflictedQueen = conflicts => {
- const randomIndex = getRandomInt(N);
- if (conflicts[randomIndex] !== 0) {
- return randomIndex;
- }
- return pickRandomConflictedQueen(conflicts);
- };
- const solve = () => {
- let [conflictCount, conflicts] = getConflicts();
- const MAX_STEPS = 2 * N;
- let step = 0;
- while (step++ < MAX_STEPS) {
- if (conflictCount === 0) {
- return "S";
- }
- const maxConfl = Math.max(...conflicts);
- const maxConfclits = conflicts.map(confl =>
- confl === maxConfl ? maxConfl : 0
- );
- const queenAtCol = pickRandomConflictedQueen(maxConfclits);
- let min = conflictCount;
- let u = [];
- let uArr = [];
- for (let j = 0; j < N; j++) {
- board[queenAtCol] = j;
- let [conflCountAtJ, conflictsAtJ] = getConflicts();
- if (conflCountAtJ < min) {
- min = conflCountAtJ;
- u = [j];
- uArr = [conflictsAtJ];
- } else if (conflCountAtJ === min) {
- u.push(j);
- uArr.push(conflictsAtJ);
- }
- }
- // tva ne e new row
- const newRow = getRandomInt(u.length - 1);
- board[queenAtCol] = u[newRow];
- conflictCount = min;
- conflicts = uArr[newRow];
- }
- return "F";
- };
- console.time("l");
- while (true) {
- board = generateBoard();
- const res = solve();
- if (res === "S") {
- break;
- }
- }
- console.timeEnd("l");
- console.log("end");
- // console.log("conflictCount, conflicts", conflictCount, conflicts);
- // console.log('board', board)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement