Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

EightQueenProblem/이선우2: Difference between revisions

From ZeroWiki
imported>Unknown
No edit summary
 
(Repair batch-0002 pages from live compare)
 
Line 11: Line 11:
 
 
  private int size;
  private int size;
  private int [] board;
  private int [] board;
  private int numberOfAnswers;
  private int numberOfAnswers;
  private boolean checkOne;
  private boolean checkOne;
Line 26: Line 26:
  if( size < 1 ) throw new Exception( NQueen2.class.getName() + "- size must be greater than 0." );
  if( size < 1 ) throw new Exception( NQueen2.class.getName() + "- size must be greater than 0." );
  this.size = size;
  this.size = size;
  board = new int[size];
  board = new int[size];
  numberOfAnswers = -1;
  numberOfAnswers = -1;
  checkOne = false;
  checkOne = false;
Line 107: Line 107:
  for( int xPos=0; xPos<size; xPos++ ) {
  for( int xPos=0; xPos<size; xPos++ ) {
  if( checkOne && numberOfAnswers > 0 ) break;
  if( checkOne && numberOfAnswers > 0 ) break;
  board[line] = xPos;
  board[line] = xPos;
  setQueenAt( line + 1 );
  setQueenAt( line + 1 );
  }
  }
Line 116: Line 116:
  {
  {
  for( int i=0; i<size; i++ )
  for( int i=0; i<size; i++ )
  if( ! checkRule( i, board[i] )) return false;
  if( ! checkRule( i, board[i] )) return false;
 
 
  return true;
  return true;
Line 128: Line 128:
  for( int i=0; i<size; i++ ) {
  for( int i=0; i<size; i++ ) {
  if( line != i )
  if( line != i )
  if( board[i] == xPos || board[i] == rightDownWay || board[i] == leftDownWay ) return false;
  if( board[i] == xPos || board[i] == rightDownWay || board[i] == leftDownWay ) return false;
  rightDownWay ++;
  rightDownWay ++;
  leftDownWay --;
  leftDownWay --;
Line 140: Line 140:
  for( int i=0; i<size; i++ ) {
  for( int i=0; i<size; i++ ) {
  for( int j=0; j<size; j++ ) {
  for( int j=0; j<size; j++ ) {
  if( board[i] == j ) out.print( queenMark );
  if( board[i] == j ) out.print( queenMark );
  else out.print( boardMark );
  else out.print( boardMark );
  }
  }
Line 148: Line 148:
   
   
   
   
  public static void main( String [] args )
  public static void main( String [] args )
  {
  {
  int sizeOfBoard = 0;
  int sizeOfBoard = 0;
  try {
  try {
  if( args.length != 1 ) throw new Exception();
  if( args.length != 1 ) throw new Exception();
  sizeOfBoard = Integer.parseInt( args[0] );
  sizeOfBoard = Integer.parseInt( args[0] );
  }
  }
  catch( Exception e ) {
  catch( Exception e ) {
Line 177: Line 177:
  }
  }
  }
  }

Latest revision as of 00:16, 27 March 2026

NQueen2.java

import java.io.PrintStream;


public class NQueen2
{
	public static final char DEFAULT_BOARD_MARK = '.';
	public static final char DEFAULT_QUEEN_MARK = 'Q';
	public static final char DEFAULT_LINE_BREAK = '\n';
	
	
	private int size;
	private int [] board;
	private int numberOfAnswers;
	private boolean checkOne;
	private int hasAnswer;
	private char boardMark;
	private char queenMark;
	private char lineBreak;
	private PrintStream out;
	
	
	private NQueen2() {}
	public NQueen2( int size ) throws Exception
	{
		if( size < 1 ) throw new Exception( NQueen2.class.getName() + "- size must be greater than 0." );
		this.size = size;
		board = new int[size];
		numberOfAnswers = -1;
		checkOne = false;
		hasAnswer = -1;
		setDefaultOutputFormat();
	}
	
	
	public int getSize()
	{
		return size;
	}
	
	
	public void setDefaultOutputFormat()
	{
		boardMark = DEFAULT_BOARD_MARK;
		queenMark = DEFAULT_QUEEN_MARK;
		lineBreak = DEFAULT_LINE_BREAK;	
	}
	
	
	public void setOutputFormat( final char boardMark, final char queenMark, final char lineBreak )
	{
		this.boardMark = boardMark;
		this.queenMark = queenMark;
		this.lineBreak = lineBreak;
	}
	
	
	public int countAnswers()
	{
		return countAnswers( null );
	}
	public int countAnswers( final PrintStream out )
	{
		if( out != null || numberOfAnswers == -1 ) {
			this.out = out;
			setQueens();
			this.out = null;
		}
	
		return numberOfAnswers;
	}


	public boolean hasAnswers()
	{
		if( hasAnswer == -1 ) {
			boolean prevCheckOne = checkOne;
			checkOne = true;
			setQueens();
			checkOne = prevCheckOne;
			numberOfAnswers = -1;
		}
		if( hasAnswer == 1 ) return true;
		
		return false;
	}
	
	
	private void setQueens()
	{
		numberOfAnswers = 0;
		setQueenAt( 0 );
	}
	
	
	private void setQueenAt( int line )
	{
		if( line == size ) {
			if( isValidQueens() ) {
				hasAnswer = 1;
				numberOfAnswers ++;
				if( out != null ) printQueen();
			}
			return;
		}
		
		for( int xPos=0; xPos<size; xPos++ ) {
			if( checkOne && numberOfAnswers > 0 ) break;
			board[line] = xPos;
			setQueenAt( line + 1 );
		}
	}
	
	
	private boolean isValidQueens()
	{
		for( int i=0; i<size; i++ )
			if( ! checkRule( i, board[i] )) return false;
	
		return true;
	}
	
	
	private boolean checkRule( final int line, int xPos )
	{
		int rightDownWay = xPos - line;
		int leftDownWay = xPos + line;
		for( int i=0; i<size; i++ ) {
			if( line != i )
				if( board[i] == xPos || board[i] == rightDownWay || board[i] == leftDownWay ) return false;
			rightDownWay ++;
			leftDownWay --;
		}
		return true;
	}


	private void printQueen()
	{
		for( int i=0; i<size; i++ ) {
			for( int j=0; j<size; j++ ) {
				if( board[i] == j ) out.print( queenMark );
				else out.print( boardMark );
			}
			out.print( lineBreak );
		}
	}


	public static void main( String [] args )
	{
		int sizeOfBoard = 0;
		try {
			if( args.length != 1 ) throw new Exception();
			sizeOfBoard = Integer.parseInt( args[0] );
		}
		catch( Exception e ) {
			System.out.println( "Usage: java NQueen2 size" );
			System.exit( 1 );
		}
		
		
		try {
			NQueen2 nq = new NQueen2( sizeOfBoard );
			
			System.out.println( "has answers? " + nq.hasAnswers() );
			System.out.println( "number of answers: " + nq.countAnswers());
			System.out.println( "has answers? " + nq.hasAnswers() );
			
			System.out.println( "number of answers: " + nq.countAnswers( System.out ));
			nq.setOutputFormat( '-','q','\n' );
			System.out.println( "number of answers: " + nq.countAnswers( System.out ));
		}
		catch( Exception e ) {
			e.printStackTrace();
		}
	}
}