提问者:小点点

这是使用回溯的nqueen问题,但是我使用了dyanamic 2D数组,我的程序编译得很好,但是没有返回任何输出


这是我的代码,当我干运行它,它工作很好,但不在编译器为什么??

提前感谢!!! 请帮忙,我试了3个小时,我的解决方案几乎是一样的,但当我在网上找到它的时候,它是用固定值在这里完成的:https://www.techiedelight.com/print-compossible-solutions-n-queens-problem/

'''

// =========================================
#include<iostream>
#include<cstring>

using namespace std;

bool valid (char **arr , int r, int c , int n)
{   
    bool present = true;

    for (size_t i = 0; i < n; i++)
    {
        if(arr [i][c] == 'Q')
        {
            present = false ;
    
        }
    }
    
   // For right diagonal
   for (size_t i = r , j = c; j>=0 && i>= 0; i++ , j--)
   {
       if(arr[i][j]== 'Q')
       {
           present = false;
           
       }
   }
   
//    for left diagonal

    for (size_t i = r , j = c ; i >= 0 && j< n; i-- , j++)
    {
        if(arr[i][i] == 'Q')
        {
            present = false ;
            
        }
    }
    
    return present;
    
}

void nqueen(char **arr, int n , int count, int row)
{
    //Base Case
    if(row == n)
    {
        for (size_t i = 0; i < n; i++)
        {
            for (size_t j = 0; j < n; j++)
            {
                cout<<arr[i][j]<<" ";
            }
            
            cout<<endl;
        }

        return;
        
    }


    //Recursive Case

    //Main key here is that you need to travel every single 
    //column in each row and then you have to go for column

    for (size_t i = 0; i < n; i++)
    {

        if(valid(arr, row, i , n))
       {
            arr[row][i] = 'Q';
            nqueen(arr, n , count++ ,row ++);
            arr[row][i] = '-';
       }
        
       
    }
    
}


int  main()
{

 #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin) ;
    freopen("output.txt", "w", stdout) ;
    #endif
    ios_base::sync_with_stdio(false);
    cin.tie(NULL) ; cout.tie(NULL) ;


    int n;
    cin>>n;
   // cout<<n; 
 
 
     char **arr = new char * [n];
     for (size_t i = 0; i < n; i++)
     {
         arr[i] = new char [n];
     }


    for (size_t i = 0; i < n; i++)
    {
        for (size_t j = 0; j < n; j++)
        {
            arr[i][j] = '-';
        }
        
    }
    

    // cout<<"Hello world.";
    //memset(arr , '-' , sizeof arr);

    nqueen (arr, n , 0 , 0);
    
    return 0;


}

'''


共1个答案

匿名用户

我相信您不是要为添加的每一个皇后增加行数

arr[row][i] = 'Q';
nqueen(arr, n , count++ ,row ++);
arr[row][i] = '-';

应该是

arr[row][i] = 'Q';
nqueen(arr, n , count++ ,row + 1);
arr[row][i] = '-';