八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
我们用图形来解决之、
看效果
#pragma once #include<math.h> namespace Queen { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 摘要 /// /// 警告: 如果更改此类的名称,则需要更改 /// 与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的 /// “资源文件名”属性。否则, /// 设计器将不能与此窗体的关联 /// 本地化资源正确交互。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: 在此处添加构造函数代码 // } protected: /// <summary> /// 清理所有正在使用的资源。 /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::ComboBox^ comboBox1; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Label^ label2; private: /// <summary> /// 必需的设计器变量。 /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> void InitializeComponent(void) { this->comboBox1 = (gcnew System::Windows::Forms::ComboBox()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->label2 = (gcnew System::Windows::Forms::Label()); this->SuspendLayout(); // // comboBox1 // this->comboBox1->FormattingEnabled = true; this->comboBox1->Location = System::Drawing::Point(134, 602); this->comboBox1->Name = L"comboBox1"; this->comboBox1->Size = System::Drawing::Size(121, 20); this->comboBox1->TabIndex = 0; this->comboBox1->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::comboBox1_SelectedIndexChanged); // // textBox1 // this->textBox1->Location = System::Drawing::Point(321, 602); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(60, 21); this->textBox1->TabIndex = 1; this->textBox1->Text = L"6"; // // button1 // this->button1->BackColor = System::Drawing::SystemColors::Control; this->button1->Location = System::Drawing::Point(396, 602); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 20); this->button1->TabIndex = 2; this->button1->Text = L"确定"; this->button1->UseVisualStyleBackColor = false; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(265, 607); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(53, 12); this->label1->TabIndex = 3; this->label1->Text = L"输入N:"; // // label2 // this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(91, 606); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(41, 12); this->label2->TabIndex = 3; this->label2->Text = L"方案:"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 12); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(592, 623); this->Controls->Add(this->label2); this->Controls->Add(this->label1); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Controls->Add(this->comboBox1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion static int N=6,num=0; static array<int>^ site=gcnew array<int>(20); static array<int,2>^ result=gcnew array<int,2>(1000,1000); static array<System::Windows::Forms::Button^,2>^ button=gcnew array<System::Windows::Forms::Button^,2>(100,100); int Isable(int row) { for(int i=1;i<row;i++) if((site[i]==site[row])||(abs(site[i]-site[row])==(row-i))) return 0; return 1; } void Queen(int row) { for(int cols=1;cols<=N;cols++) { site[row]=cols; if(Isable(row)) { if(row==N) { num++; this->comboBox1->Items->Add("方案 "+num); for(int i=1;i<=N;i++) result[num,i]=site[i]; return; } Queen(row+1); } } } void Erase() { for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) this->Controls->Remove(this->button[i,j]); this->comboBox1->Items->Clear(); N=Convert::ToInt16(this->textBox1->Text); num=0; for(int i=1;i<=N;i++) site[i]=0; } void Show() { int a; a=600/N; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) { this->button[i,j] = (gcnew System::Windows::Forms::Button()); this->button[i,j]->Location = System::Drawing::Point((i-1)*a, (j-1)*a); this->button[i,j]->Name = L"button1"; this->button[i,j]->Size = System::Drawing::Size(a, a); this->button[i,j]->TabIndex = 2; this->button[i,j]->Text = L"确定"; this->button[i,j]->UseVisualStyleBackColor = true; this->Controls->Add(this->button[i,j]); } } void ShowQueen() { for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) //this->button[i,j]->BackColor=System::Drawing::SystemColors::Control; this->button[i,j]->UseVisualStyleBackColor = true; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) { if(result[this->comboBox1->SelectedIndex+1,i]==j) this->button[i,j]->BackColor=System::Drawing::Color::Red; } } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Erase(); Show(); Queen(1); } private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { ShowQueen(); } }; }
代码下载