代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace EightQueen
{
class Program
{
static void Main(string[] args)
{
InitBoard(board);
HasPlacedQueen(0, 0, 0);
PrintBoard();
Console.Read();
}
static int N=8;
static char[,] board = new char[N, N];
private static int HasPlacedQueen(int locX, int locY, int queenNum)
{
int result = 0;
if (queenNum == N)
return 1;
else
if (CanPlaceQueen(locX, locY))
{
board[locX, locY] = 'q';
/
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
result += HasPlacedQueen(i, j, queenNum + 1);
if (result > 0)
{
break;
}
}
if (result > 0)
return 1;
else
{
board[locX, locY] = 'x';
return 0;
}
}
else
return 0;
}
private static bool CanPlaceQueen(int locX, int locY)
{
int i = 0, j = 0;
if (board[locX, locY] != 'x')
{
return false;
}
上方
for (j = locY - 1; j >= 0; j--)
{
if (board[locX, j] != 'x')
{
return false;
}
}
下方
for (j = locY + 1; j < N; j++)
{
if (board[locX, j] != 'x')
{
return false;
}
}
左方
for (i = locX - 1; i >= 0; i--)
{
if (board[i, locY] != 'x')
{
return false;
}
}
右边
for (i = locX + 1; i < N; i++)
{
if (board[i, locY] != 'x')
{
return false;
}
}
左上方
i=locX-1;
j = locY - 1;
while (i >= 0 && j >= 0)
{
if (board[i--,j--] != 'x')
{
return false;
}
}
右上方
i = locX + 1;
j = locY - 1;
while (i < N && j >= 0)
{
if (board[i++,j--] != 'x')
{
return false;
}
}
左下方
i = locX - 1;
j = locY + 1;
while (i >= 0 && j < N)
{
if (board[i--,j++] != 'x')
{
return false;
}
}
i = locX + 1;
j = locY + 1;
while (i < N && j < N)
{
if (board[i++,j++] != 'x')
{
return false;
}
}
return true;
}
private static void InitBoard(char [,] board)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
board[i, j] = 'x';
}
}
}
private static void PrintBoard()
{
for (int i = 0; i < N; i++)
{
Console.Write(" " + i + " ");
}
Console.WriteLine();
for (int i = 0; i < N; i++)
{
Console.Write(" "+ "---");
}
Console.WriteLine();
for (int i = 0; i < N; i++)
{
Console.Write(" " + i);
for (int j = 0; j < N; j++)
{
Console.Write("-{0}-|", board[i, j]);
}
Console.WriteLine();
//Console.Write("+");
//for (int k = 0; k < N; k++)
//{
// Console.Write("---+");
//}
//Console.WriteLine();
}
}
}
}
//非递归
using System;
using System.Collections.Generic;
using System.Text;
namespace EightQueen
{
class Program
{
static int N = 2;
static char[,] board = new char[N, N];
static Stack<Pair> queenStack = new Stack<Pair>();
public class Pair
{
public int x;
public int y;
public Pair(int a, int b)
{
x = a;
y = b;
}
}
static void Main(string[] args)
{
InitBoard(board);
TryPlaceQueen();
PrintBoard();
Console.Read();
}
private static void TryPlaceQueen()
{
Pair current = new Pair(0, 0);
Pair nextPair = new Pair(0, 0);
while (queenStack.Count < N)
{
current = nextPair;
if (CanPlaceQueen(current.x, current.y))
{
queenStack.Push(current);
board[current.x, current.y] = 'Q';
nextPair = GetNextLine(current);
continue;
}
else
{
while(current.y ==N-1 && queenStack.Count>0)
{
current = queenStack.Pop();
board[current.x, current.y] = 'x';
}
nextPair = GetNext(current);
}
}
while (queenStack.Count > 0)
{
Pair queen = queenStack.Pop();
board[queen.x, queen.y] = 'Q';
}
}
private static Pair GetNext(Pair current)
{
Pair target = new Pair(current.x, current.y);
int targetY = current.y + 1;
if (targetY == N)
{
target.x += 1;
target.y = 0;
}
else
{
target.y += 1;
}
return target;
}
private static Pair GetNextLine(Pair current)
{
Pair target = new Pair(current.x,current.y);
target.x = current.x + 1;
target.y = 0;
return target;
}
private static int HasPlacedQueen(int locX, int locY, int queenNum)
{
int result = 0;
if (queenNum == N)
return 1;
else
if (CanPlaceQueen(locX, locY))
{
board[locX, locY] = 'q';
/
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
result += HasPlacedQueen(i, j, queenNum + 1);
if (result > 0)
{
break;
}
}
if (result > 0)
return 1;
else
{
board[locX, locY] = 'x';
return 0;
}
}
else
return 0;
}
private static bool CanPlaceQueen(int locX, int locY)
{
int i = 0, j = 0;
if (board[locX, locY] != 'x')
{
return false;
}
上方
for (j = locY - 1; j >= 0; j--)
{
if (board[locX, j] != 'x')
{
return false;
}
}
下方
for (j = locY + 1; j < N; j++)
{
if (board[locX, j] != 'x')
{
return false;
}
}
左方
for (i = locX - 1; i >= 0; i--)
{
if (board[i, locY] != 'x')
{
return false;
}
}
右边
for (i = locX + 1; i < N; i++)
{
if (board[i, locY] != 'x')
{
return false;
}
}
左上方
i=locX-1;
j = locY - 1;
while (i >= 0 && j >= 0)
{
if (board[i--,j--] != 'x')
{
return false;
}
}
右上方
i = locX + 1;
j = locY - 1;
while (i < N && j >= 0)
{
if (board[i++,j--] != 'x')
{
return false;
}
}
左下方
i = locX - 1;
j = locY + 1;
while (i >= 0 && j < N)
{
if (board[i--,j++] != 'x')
{
return false;
}
}
右下
i = locX + 1;
j = locY + 1;
while (i < N && j < N)
{
if (board[i++,j++] != 'x')
{
return false;
}
}
return true;
}
private static void InitBoard(char [,] board)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
board[i, j] = 'x';
}
}
}
private static void PrintBoard()
{
for (int i = 0; i < N; i++)
{
Console.Write(" " + i + " ");
}
Console.WriteLine();
for (int i = 0; i < N; i++)
{
Console.Write(" "+ "---");
}
Console.WriteLine();
for (int i = 0; i < N; i++)
{
Console.Write(" " + i);
for (int j = 0; j < N; j++)
{
Console.Write("-{0}-|", board[i, j]);
}
Console.WriteLine();
}
}
}
}