Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在这个8皇后算法中进一步进行?_C++_C_Backtracking - Fatal编程技术网

C++ 如何在这个8皇后算法中进一步进行?

C++ 如何在这个8皇后算法中进一步进行?,c++,c,backtracking,C++,C,Backtracking,代码和输出在回溯之前运行良好,但我无法继续回溯。取消铺贴后要做什么?它是在回溯之前给出前4个皇后的输出的唯一方法 #include <iostream> #include <conio.h> using namespace std; int recu(int i,int k); void place(int i,int k); void unplace(int i,int k); int q[8][8]; i

代码和输出在回溯之前运行良好,但我无法继续回溯。取消铺贴后要做什么?它是在回溯之前给出前4个皇后的输出的唯一方法

    #include <iostream>
    #include <conio.h>
    using namespace std;
    int recu(int i,int k);
    void place(int i,int k);
    void unplace(int i,int k);
    int q[8][8];
    int row[8];
    int column[8];
    int c[15];
    int d[15];
    int totalqueens=0;
    int s;

    int main()
    {
        for(int i=0;i<8;i++) //Flags for rows,columns and diagonals
        {
        row[i]=0;
        column[i]=0;
        c[i]=0;d[i]=0;
        }
        for(int i=8;i<15;i++)
        {
        c[i]=0;d[i]=0;
        }
        int i=0;
        int k=0;
        recu(i,k);


      for(int i=0;i<8;i++)
      {
          for(int k=0;k<8;k++)
          {
                if(q[i][k]==1)
                {
                   cout<<"(";
                   cout<<i;
                   cout<<",";
                   cout<<k;
                   cout<<")";
                }
           }
     }

    getch();
    return 0;
}

int recu(int i,int k)
{ 
     if(totalqueens==8)
     {  goto print; }
     if(k<8)
      {
          if(column[i]==0 && row[k]==0 && c[i+k]==0 && d[i-k+7]==0)
           {
             place(i,k);

             s=k;
             k=0;
             recu(i+1,k);
           }
           else
           { 
             recu(i,k+1);
             unplace(i-1,s);
            //**I am not able to proceed further**
           }

      }

print:
    ;
}

void place(int i,int k)
{     
    totalqueens++;
    q[i][k]=1;
    row[k]=1;
    column[i]=1;
    c[i+k]=1;
    d[i-k+7]=1;
}

void unplace(int i,int k)
{
    q[i][k]=0;
    row[i]=0;
    column[k]=0;
    c[i+k]=0;
    d[i-k+7]=0;
    //cout<<"before call";
    recu(i,k+1);
    //cout<<"working";
}
#包括
#包括
使用名称空间std;
intrecu(inti,intk);
无效地点(int i,int k);
无效取消配置(int i、int k);
int q[8][8];;
int行[8];
int列[8];
INTC[15];
int d[15];
int totalqueens=0;
int-s;
int main()
{

对于(int i=0;i当未放置所有皇后且无法放置另一个皇后时,返回。返回如下:

  • 看看最后一个放置的皇后是否可以放置在以后的位置。如果可以,请将其放置在那里并停止回溯。(继续放置。)

  • 移除最后一位皇后

  • 如果没有皇后了,停下来。所有的解决方案都找到了

  • 转到步骤1


  • 您的代码只给出一个解决方案。 u r未将输出部件放在正确的位置

    试着这样做:

    void print()
    {
          for(int i=0;i<8;i++)
          {
              for(int k=0;k<8;k++)
              {
                    if(q[i][k]==1)
                    {
                       cout<<"(";
                       cout<<i;
                       cout<<",";
                       cout<<k;
                       cout<<")";
                    }
               }
         }
    }
    
    记住,不要使用后藤句子。它很难看,可能会引起未知的问题

    if(totalqueens==8)
    {
        print();
        return;
    }