λλμ ¶
λ¬Έμ μ λν κ°λ΅μ μΈ μ΄ν΄λ§ νκ³ μ λ§μΉ κ·Έ μκ³ λ¦¬μ¦μ μμ ν μ΄ν΄ν λ₯ 무ν±λκ³ μ½λ©μ λ€μ΄κ°λ€κ° μ λ΅μ΄κ³ λκ³ μμ ν μμΌλ²λ Έμ΅λλ€. κ²°κ΅ μ²μλΆν° λ€μ μ½λ© μ΄μ λ¨κ³λΆν° μ°¨κ·Όν μ€λΉνμ¬ κ²¨μ° λ¬Έμ λ₯Ό ν΄κ²°ν μ μμμ΅λλ€. μ½λ© μ΄μ μ μ¬λ¬ νλ‘κ·Έλλ° λ¨κ³λ ν¨λΆλ‘ 건λλΈ λ¨κ³κ° μλλ κ²μ λ€μ νλ² λΌ μ κΉμ΄ κΉ¨λ¬μμΌλ©° μ±λ₯μ μν΄ μ곡 κ΅ν λ²μΉμ λλ¦λλ‘ μ μ©ν΄ 보μλλ° κ·Έ ν¨κ³Όμ μλΉν¨μ κ²½ννμμ΅λλ€.
- μκ³ λ¦¬μ¦μ΄ μ€μνλ€
- λμμΈλ μ€μνλ€.
- μ±λ₯μ λμ΄κ³ μ νλ€λ©΄ μ°μ μ곡 κ΅ν λ²μΉμ μ΄μ©νμ.
μ곡 κ΅ν λ²μΉμ΄ λμ£ ?
μ±λ₯μ΄λ κ²μ ν¬κ² μν μκ°(ζ)κ³Ό μνμ νμν λ©λͺ¨λ¦¬(η©Ί)λΌλ 2κ°μ§ μΈ‘λ©΄μμ λ³Έλ€λ©΄ λ©λͺ¨λ¦¬μͺ½μ μ±λ₯μ ν¬μν΄μ μν μκ°μ λμ΄μ¬λ¦¬λ κ²μ λ§ν©λλ€. μ¦, μμ£Ό μ°μΌ κ² κ°μ κ³μ° κ²°κ³Όλ λ§€λ² κ³μ°νμ§ μκ³ λ©λͺ¨λ¦¬μ λ΄μλκ±°λ μΈλΆμ μ μ₯νλ€κ° κ°μ Έμ€λ μμ΄ λλ κ±°μ£ . μ κ°μ κ²½μ° λ¬Έμ λ₯Ό νκΈ° μν΄ μ²΄μ€ν μμ νΈ νλκ° λμΌ λλ§λ€ λ€μ νΈμ΄ λμΌ μ μλ "κ°λ₯ν μ리λ₯Ό κ³μ°"ν΄μ κ·Έ λ€μ νΈμ λ°°μΉνλ λ°©μμ μ¬μ©νμ΅λλ€. μ΄ λ "κ°λ₯ν μ리λ₯Ό κ³μ°"ν κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬μ λ΄μλκ³ κ³μ μ΄μ©νμμ£ . μ°Έκ³ λ‘ μ΄ μ©μ΄μ κ°λ λ€μ κΉμ°½μ€λμ΄ λ§μμ κΈ°κ³ νμ νμ΄μ¬ κ΄λ ¨ κΈ°μ¬μμ λΉμ€λ―리 μΈμ©ν κ² μ λλ€. μΈμ©μ΄λ λ³Έλ κ·Έ λ΄μ©μ μ νν μ λ¬ν΄μΌ νλλ° -_-;;; λ§μ κΈ°μ¬λ₯Ό μ§μ μ°Έκ³ ν΄λ³΄μκΈ° λ°λλλ€
See Also λ§μ2001λ
4μ About Python κΈ°μ¬ - νμ΄μ¬ μ΅μ νλ‘
μμ€ νμΌ ¶
QueensProblem.java ¶
~cpp public class QueensProblem { // to run, prompt>java QueensProblem x public static void main(String[] args) { QueensProblem problem = new QueensProblem(Integer.parseInt(args[0])); long start = System.currentTimeMillis(); problem.locate(0); System.out.println("μμμκ°(ms) = " + String.valueOf(System.currentTimeMillis() - start)); System.out.println("κ°λ₯ν ν΄λ΅ = " + String.valueOf(problem.getSuccessNum())); } public QueensProblem(int queensNum) { this.queensNum = queensNum; board = new Chessboard(queensNum); } public int getSuccessNum() { return successNum; } public boolean locate(int index) { if (index == queensNum) { ++successNum; // System.out.println("μ±κ³΅ " + String.valueOf(++successNum)); // System.out.println(board); return true; } Chessboard.PointList points = board.getAvailablePoints(); Point point = null; while ((point = points.nextPoint()) != null) { if(point.getY() == index + 1) return false; Queen queen = new Queen(point); board.locate(queen); if (locate(index + 1)) { // return true; board.rollback(); } else { board.rollback(); } } return false; } private Chessboard board; private int queensNum; private int successNum; }
Chessboard.java ¶
~cpp import java.util.*; public class Chessboard { public Chessboard(int size) { this.size = size; queens = new Stack(); availablePointsStack = new Stack(); List availablePoints = new ArrayList(); for (int y = 0; y < size; ++y) for (int x = 0; x < size; ++x) availablePoints.add(new Point(x, y)); availablePointsStack.push(new PointList(availablePoints)); } public void locate(Queen queen) { List availablePoints = new ArrayList(); List points = ((PointList)availablePointsStack.peek()).getPoints(); Iterator pointsIter = points.iterator(); while (pointsIter.hasNext()) { Point point = (Point)pointsIter.next(); if (!queen.canAttack(point)) availablePoints.add(point); } queens.push(queen); availablePointsStack.push(new PointList(availablePoints)); } public void rollback() { queens.pop(); availablePointsStack.pop(); } public PointList getAvailablePoints() { return (PointList)availablePointsStack.peek(); } public String toString() { StringBuffer buff = new StringBuffer(); Iterator iter = queens.iterator(); while (iter.hasNext()) { Queen queen = (Queen)iter.next(); buff.append(queen.getPoint().toString()); buff.append("\n"); } return buff.toString(); } private int size; private Stack queens; private Stack availablePointsStack; public static class PointList { public PointList(List points) { this.points = points; index = 0; } public Point nextPoint() { Point point = null; if (index < points.size()) { point = (Point)points.get(index); ++index; } return point; } public List getPoints() { return points; } public String toString() { StringBuffer buff = new StringBuffer(); Iterator iter = points.iterator(); while (iter.hasNext()) { Point point = (Point)iter.next(); buff.append(point); buff.append("\n"); } return buff.toString(); } private int index; private List points; } }
Queen.java ¶
~cpp public class Queen { public Queen(Point point) { this.point = point; } public boolean canAttack(Point p) { return point.equalsX(p) || point.equalsY(p) || point.isLocatedCrossly(p); } public Point getPoint() { return point; } private Point point; }
Point.java ¶
~cpp public class Point { public Point(int x, int y) { this.x = x; this.y = y; } public boolean equalsX(Point point) { return point.x == x; } public boolean equalsY(Point point) { return point.y == y; } public boolean isLocatedCrossly(Point point) { int diffX = Math.abs(point.x - x); int diffY = Math.abs(point.y - y); return diffX == diffY; } public int getX() { return x; } public int getY() { return y; } public String toString() { return "(" + String.valueOf(x) + ", " + String.valueOf(y) + ")"; } private int x; private int y; }