运用C#WPF编程实现了经典的回溯算法解决“八皇后问题”
程序运行演示结果如下:
算法核心代码:
namespace nQueen{ ///前台代码/// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { Queen[] queens; int[] queenPosition; Boolean[] isEnableColumn; Boolean[] isEnableLeft; Boolean[] isEnableRight; int queenNumber; ////// 构造函数 /// public MainWindow() { queens = new Queen[8]; initAl(8); InitializeComponent(); //drawGrid(8); } ////// 根据皇后数目绘制棋盘函数(暂不使用) /// /// 皇后数目 public void drawQueen() { for (int i = 0; i < queenNumber; i++) { setQueen(i, queenPosition[i]); } } ////// 初始化算法数据 /// /// public void initAl(int number) { queenPosition = new int[number]; isEnableColumn = new Boolean[number]; for (int i = 0; i < number; i++) { isEnableColumn[i] = true; } isEnableLeft = new Boolean[number * 2 - 1]; for (int i = 0; i < number * 2 - 1; i++) { isEnableLeft[i] = true; } isEnableRight = new Boolean[number * 2 - 1]; for (int i = 0; i < number * 2 - 1; i++) { isEnableRight[i] = true; } queenNumber = number; } ////// 设置皇后的位置,如果此皇后已经存在则改变皇后的位置 /// /// 表示第几个皇后 /// 表示皇后所在的行数 /// 表示皇后所在的列数 public void setQueen(int row,int column) { if (queens[row] != null) { GridMain.Children.Remove(queens[row]); GridMain.UnregisterName("queen" + row.ToString()); } else { queens[row] = new Queen(); } queens[row].Name = "queen" + row.ToString(); GridMain.Children.Add(queens[row]); GridMain.RegisterName("queen" + row.ToString(), queens[row]); Grid.SetRow(queens[row], row); Grid.SetColumn(queens[row], column); } //public void deleteQueen(int queenSeq); ////// 开始运算按钮事件 /// /// /// private void button2_Click(object sender, RoutedEventArgs e) { setQueen( 5, 2); } ////// 初始化按钮事件 /// /// /// private void startButton_Click(object sender, RoutedEventArgs e) { putQueen(0); drawQueen(); //string output=""; //for (int i = 0; i < queenNumber; i++) //{ output += queenPosition[i].ToString(); //output += " "; //} // MessageBox.Show(output); } ////// 放置皇后 /// /// 放置第N行的皇后 public bool putQueen(int row) { if (row == queenNumber) { return true; } for (int col = 0; col < queenNumber; col++) { //判断此列是否可用(列,左对角线,右对角线均为true) if (isEnableColumn[col] && isEnableLeft[row + col] && isEnableRight[row - col + queenNumber-1]) { queenPosition[row] = col; isEnableColumn[col] = false; isEnableLeft[row + col] = false; isEnableRight[row - col + queenNumber-1] = false; if(putQueen(row + 1))return true; isEnableColumn[col] = true; isEnableLeft[row + col] = true; isEnableRight[row - col + queenNumber-1] = true; } } return false; } }}