【问题标题】:N-Queens Algorithm using c++使用 C++ 的 N-Queens 算法
【发布时间】:2018-08-15 17:43:40
【问题描述】:

我正在尝试使用 C++ 解决 N-Queens 问题,但我没有得到正确的输出,也许我的 is_attacked() 函数有一些问题。请帮助我改进我的代码。

#include <bits/stdc++.h>
using namespace std;
int N;
int board[10][10] = {0};

//to check attacking position
bool is_attacked(int row, int col) {
for(int i=0;i<N;++i)
{
    if(board[row][i] == 1 || board[i][col] == 1)
        return true;
}
if(row >= 1)
    if(board[row-1][col-1] == 1 || board[row-1][col+1] == 1)
        return true;

return false;
}
//to print the values
void print()
{
  for(int i=0;i<N;++i)
  {
    for(int j=0;j<N;++j)
    {
        cout << board[i][j] << " ";
    }
    cout << "\n";
  }
}
//to solve the problem
bool solve(int n) 
{
   if(n == 0)
     return true;
   //main logic, i => row, j => columns
   for(int i=0; i < n; ++i)
   {
     for(int j=0; j<n; ++j)
     {

        if(is_attacked(i, j))
            continue;
        board[i][j] = 1;
        if(solve(n-1))
            return true;
        board[i][j] = 0;

      }
    }
  return false;
}

int main() {
 cin >> N;
 //let's add some basic_cases
  if(N == 2 || N == 3)
  {    cout << "Not possible";
       exit(0);
  }
  if(solve(N))
     print();
  else 
     cout << "Not Possible";
  return 0;
}

它应该显示

0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0

但我得到了

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

请帮助我...提前谢谢...

【问题讨论】:

  • 欢迎来到 StackOverflow。请参阅How to Ask。只是发布一段代码并要求我们为您调试它的问题在这里是题外话。
  • 你做了哪些调试尝试?您是否尝试过将打印语句放入代码中以在各个点验证您的假设?
  • Stack Overflow 不是免费的调试服务,您应该展示您使用调试器或其他更简单的方法(例如调试打印语句)调试代码的尝试。您还可以分别测试代码的每个部分,以准确找出导致问题的代码部分,并创建minimal reproducible example。这不是您唯一一次在代码中遇到错误,学习调试程序比让别人为您找到错误对您的帮助要大得多。调试自己的代码是编程中的一项重要技能。见idownvotedbecau.se/nodebugging
  • 抱歉跑题了,但我是编程新手,我只是想要一些帮助,这就是我发布问题的原因......希望你们都能理解这一点

标签: c++ c++14


【解决方案1】:

is_attaced 中检查对角线的部分不起作用。它有两个基本问题,首先你不检查所有行的所有对角线 - 你只检查前一行。其次,当您位于第一列或最后一列时,您正在进行越界访问。

一种效率不高但易于理解的实现分别检查两个对角线

for( int i=min(col, row); i>0;i-- )
{
   if( board[row-i][col-i]==1 )
      return true;
}
for( int i=MAX_COL; i>row;i-- )
{
   if( board[row-i][col+i]==1 )
      return true;
}

更好的方法是在一个循环中完成这两项工作。

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多