λλμ ¶
λ¬Έμ μ λν κ°λ΅μ μΈ μ΄ν΄λ§ νκ³ μ λ§μΉ κ·Έ μκ³ λ¦¬μ¦μ μμ ν μ΄ν΄ν λ₯ 무ν±λκ³ μ½λ©μ λ€μ΄κ°λ€κ° μ λ΅μ΄κ³ λκ³ μμ ν μμΌλ²λ Έμ΅λλ€. κ²°κ΅ μ²μλΆν° λ€μ μ½λ© μ΄μ λ¨κ³λΆν° μ°¨κ·Όν μ€λΉνμ¬ κ²¨μ° λ¬Έμ λ₯Ό ν΄κ²°ν μ μμμ΅λλ€. μ½λ© μ΄μ μ μ¬λ¬ νλ‘κ·Έλλ° λ¨κ³λ ν¨λΆλ‘ 건λλΈ λ¨κ³κ° μλλ κ²μ λ€μ νλ² λΌ μ κΉμ΄ κΉ¨λ¬μμΌλ©° μ±λ₯μ μν΄ μ곡 κ΅ν λ²μΉμ λλ¦λλ‘ μ μ©ν΄ 보μλλ° κ·Έ ν¨κ³Όμ μλΉν¨μ κ²½ννμμ΅λλ€.
- μκ³ λ¦¬μ¦μ΄ μ€μνλ€
- λμμΈλ μ€μνλ€.
- μ±λ₯μ λμ΄κ³ μ νλ€λ©΄ μ°μ μ곡 κ΅ν λ²μΉμ μ΄μ©νμ.
μ곡 κ΅ν λ²μΉμ΄ λμ£ ?
μ±λ₯μ΄λ κ²μ ν¬κ² μν μκ°(ζ)κ³Ό μνμ νμν λ©λͺ¨λ¦¬(η©Ί)λΌλ 2κ°μ§ μΈ‘λ©΄μμ λ³Έλ€λ©΄ λ©λͺ¨λ¦¬μͺ½μ μ±λ₯μ ν¬μν΄μ μν μκ°μ λμ΄μ¬λ¦¬λ κ²μ λ§ν©λλ€. μ¦, μμ£Ό μ°μΌ κ² κ°μ κ³μ° κ²°κ³Όλ λ§€λ² κ³μ°νμ§ μκ³ λ©λͺ¨λ¦¬μ λ΄μλκ±°λ μΈλΆμ μ μ₯νλ€κ° κ°μ Έμ€λ μμ΄ λλ κ±°μ£ . μ κ°μ κ²½μ° λ¬Έμ λ₯Ό νκΈ° μν΄ μ²΄μ€ν μμ νΈ νλκ° λμΌ λλ§λ€ λ€μ νΈμ΄ λμΌ μ μλ "κ°λ₯ν μ리λ₯Ό κ³μ°"ν΄μ κ·Έ λ€μ νΈμ λ°°μΉνλ λ°©μμ μ¬μ©νμ΅λλ€. μ΄ λ "κ°λ₯ν μ리λ₯Ό κ³μ°"ν κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬μ λ΄μλκ³ κ³μ μ΄μ©νμμ£ . μ°Έκ³ λ‘ μ΄ μ©μ΄μ κ°λ λ€μ κΉμ°½μ€λμ΄ λ§μμ κΈ°κ³ νμ νμ΄μ¬ κ΄λ ¨ κΈ°μ¬μμ λΉμ€λ―리 μΈμ©ν κ² μ λλ€. μΈμ©μ΄λ λ³Έλ κ·Έ λ΄μ©μ μ νν μ λ¬ν΄μΌ νλλ° -_-;;; λ§μ κΈ°μ¬λ₯Ό μ§μ μ°Έκ³ ν΄λ³΄μκΈ° λ°λλλ€.png)
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;
}










