c++中八皇后拼图程序的修改
Modification of the Eight queens puzzle program in c++
所以八皇后谜题已经解决了很多次,但我还没有见过一个用c++编写的程序,它允许用户输入一行来开始搜索。
作业指导:修订本程序,使main()不必只从第0行开始。相反,程序将读取起始行数字(范围为0–7)。对原始程序,这样它仍然可以打印出从指定行开始的可行位置。
这是原始程序的代码:
#include <iostream>
using namespace std;
const int NUMBER_OF_QUEENS = 8; // Constant: eight queens
int queens[NUMBER_OF_QUEENS];
// Check whether a queen can be placed at row i and column j
bool isValid(int row, int column)
{
for (int i = 1; i <= row; i++)
if (queens[row - i] == column // Check column
|| queens[row - i] == column - i // Check upper left diagonal
|| queens[row - i] == column + i) // Check upper right diagonal
return false; // There is a conflict
return true; // No conflict
}
// Display the chessboard with eight queens
void printResult()
{
cout << "n---------------------------------n";
for (int row = 0; row < NUMBER_OF_QUEENS; row++)
{
for (int column = 0; column < NUMBER_OF_QUEENS; column++)
printf(column == queens[row] ? "| Q " : "| ");
cout << "|n---------------------------------n";
}
}
// Search to place a queen at the specified row
bool search(int row)
{
if (row == NUMBER_OF_QUEENS) // Stopping condition
return true; // A solution found to place 8 queens in 8 rows
for (int column = 0; column < NUMBER_OF_QUEENS; column++)
{
queens[row] = column; // Place a queen at (row, column)
if (isValid(row, column) && search(row + 1))
return true; // Found, thus return true to exit for loop
}
// No solution for a queen placed at any column of this row
return false;
}
int main()
{
search(0); // Start search from row 0. Note row indices are 0 to 7
printResult(); // Display result
return 0;
}
这是我到目前为止写的代码,它运行不正确,我只做了一些修改。我不完全确定如何解决这个问题,但main()正是修改时应该做的。
#include <iostream>
using namespace std;
const int NUMBER_OF_QUEENS = 8; // Constant: eight queens
int queens[NUMBER_OF_QUEENS];
// Check whether a queen can be placed at row i and column j
bool isValid(int row, int column)
{
for (int i = 1; i <= row; i++)
if (queens[row - i] == column // Check column
|| queens[row - i] == column - i // Check upper left diagonal
|| queens[row - i] == column + i) // Check upper right diagonal
return false; // There is a conflict
return true; // No conflict
}
// Display the chessboard with eight queens
void printResult(int row)
{
cout << "n---------------------------------n";
for (row; row < NUMBER_OF_QUEENS; row++)
{
for (int column = 0; column < NUMBER_OF_QUEENS; column++)
printf(column == queens[row] ? "| Q " : "| ");
cout << "|n---------------------------------n";
}
}
// Search to place a queen at the specified row
bool search(int row)
{
if (row == NUMBER_OF_QUEENS) // Stopping condition
return true; // A solution found to place 8 queens in 8 rows
for (int column = 0; column < NUMBER_OF_QUEENS; column++)
{
queens[row] = column; // Place a queen at (row, column)
if (isValid(row, column) && search(row + 1))
return true; // Found, thus return true to exit for loop
}
// No solution for a queen placed at any column of this row
return false;
}
int main()
{
int inputRow;
cout << "Enter the row to search from:" << endl;
cin >> inputRow;
search(inputRow); // Start search from row 0. Note row indices are 0 to 7
printResult(inputRow); // Display result
return 0;
}
现在我对编程和这个网站还很陌生,因为我去年开始学习java,一个半月前才开始学习c++,所以如果我格式不正确或措辞不太好,我很抱歉,但我被这个问题难住了,我真的很感激程序员花在这个网站上的时间以及你能给我的任何帮助。
您的实现中存在一些错误。
如果你想推广算法,你可以让用户选择第一个女王的位置(行和列)。
#include <iostream>
using namespace std;
const int NUMBER_OF_QUEENS = 8; // Constant: eight queens
int queens[NUMBER_OF_QUEENS];
bool isValid(int row, int column);
bool search(int q);
// Display the chessboard with the queens
void printResult()
{
cout << "n+---+---+---+---+---+---+---+---+n";
for ( int row = 0; row < NUMBER_OF_QUEENS; row++)
{
for (int column = 0; column < NUMBER_OF_QUEENS; column++)
printf(column == queens[row] ? "| Q " : "| ");
cout << "|n+---+---+---+---+---+---+---+---+n";
}
}
int main() {
int iRow, iColumn;
cout << "Please, enter the row and the column of the cell where you want to put the first Queen into." << endl;
cout << "Input values must be in the range 0 - " << NUMBER_OF_QUEENS << ". Enter a letter to stop." << endl;
while (cin >> iRow && cin >> iColumn) {
if ( iRow < 0 || iRow > NUMBER_OF_QUEENS - 1
|| iColumn < 0 || iColumn > NUMBER_OF_QUEENS - 1 ) continue;
for ( int k = 0; k < NUMBER_OF_QUEENS; k++) queens[k] = - NUMBER_OF_QUEENS;
queens[iRow] = iColumn; // initialize the array with significant values. Ugly, I know.
if ( !search(0) ) // Start the search
cerr << "Error: Unable to find a solution!n";
printResult(); // Display result
}
return 0;
}
你的检查功能不能完成完整的扫描,我更喜欢这个:
// Check whether a queen can be placed at row i and column j
bool isValid(int row, int column)
{
int d1 = column - row;
int d2 = column + row;
for (int i = 0; i < NUMBER_OF_QUEENS; i++) {
if ( queens[i] == column // Check column
|| queens [i] == d1 // Check diagonals
|| queens [i] == d2 )
return false; // There is a conflict
d1++;
d2--;
}
return true; // No conflict
}
但主要的问题是搜索功能,它必须尝试一个可能的位置,如果无效则拒绝:
// Search to place a queen at the specified row
bool search(int q)
{
if (q >= NUMBER_OF_QUEENS) // Stopping condition, all rows visited
return true; // A solution found to place 8 queens in 8 rows
if ( queens[q] != -NUMBER_OF_QUEENS ) // Skip the row if a queen is already there
return search(q+1);
else {
for (int column = 0; column < NUMBER_OF_QUEENS; column++) {
if (isValid(q, column)) { // First check, then
queens[q] = column; // place a queen at (row, column)
if ( search(q + 1) ) return true; // Found, thus return true to exit for loop
else queens[q] = - NUMBER_OF_QUEENS; // Reject the wrong position
}
}
}
// No solution for a queen placed at any column of this row
return false;
}
现在您可以测试程序了。例如,如果输入2 5
,则输出为:
+---+---+---+---+---+---+---+---+
| | Q | | | | | | |
+---+---+---+---+---+---+---+---+
| | | | Q | | | | |
+---+---+---+---+---+---+---+---+
| | | | | | Q | | |
+---+---+---+---+---+---+---+---+
| | | | | | | | Q |
+---+---+---+---+---+---+---+---+
| | | Q | | | | | |
+---+---+---+---+---+---+---+---+
| Q | | | | | | | |
+---+---+---+---+---+---+---+---+
| | | | | | | Q | |
+---+---+---+---+---+---+---+---+
| | | | | Q | | | |
+---+---+---+---+---+---+---+---+
您所做的更改中肯定存在错误
在printResult中,您添加了一个"row"参数;但是,它实际上并没有被使用,因为for语句声明了另一个覆盖它的变量"row"
如果你想要更多的细节,你必须更多地描述你看到的问题是什么(编译器错误、运行时错误、错误输出等)
另外,请注意,isValid(int row, int column)
查看queens[row - i]
的内容以做出该决定。您的方法将跳过最初的行,因此isValid将没有做出正确决策所需的信息。我建议您必须完成对所有行的搜索,只需打印一行即可。
相关文章:
- 修改创建帐户程序
- 修改程序的入口点时未调用全局变量的构造函数
- 修改多线程应用程序中的对象
- 当该应用程序中加速文件的最后一个修改时间发生更改时,如何重新启动应用程序
- 如何在用户修改后使用旧版驱动程序中的 PE 标头获取原始文件类型
- 如何从功能(C UWP应用程序)中修改按钮内容
- 使用 gstreamer 的应用程序和应用程序修改视频
- Linux x64堆栈在信号处理程序内部展开,以修改返回地址
- 在任务管理器中修改应用程序图标,而不是在系统托盘中
- 如何设计这个易于修改的程序
- 我如何修改我的C 程序以显示用户输入的单词,并使用堆栈向后
- 修改OBJ文件链接到的源文件会破坏应用程序吗
- 修改气泡排序的程序出错
- DUMPBIN 实用程序修改了名称输出
- 在c++中修改时间程序时出现逻辑错误
- 修改程序以加密大写和小写输入
- 在 Windows 中修改文件夹时通知我的应用程序
- 在Win32程序中C++,如何修改菜单的标题?
- 安装程序修改了哪些DLL和注册表项
- 使用mongodb c#和c++驱动程序修改bson文档