n皇后问题代码补充,最后还要实现步骤演示,还是动画的形式

n皇后问题的代码补充,给了一个框架,有点看不懂。

#include <iostream>
#include <windows.h>
using namespace std;

int abs(int a, int b)   // 返回两个参数差值的绝对值
{
    int c;
    c=a-b;
    if(c>=0)    // 填写代码
        c=c;
    else
        c=-c;
    return c;

}

void print( )   // 对皇后位置进行输出,补充参数定义
{
    // 填写代码
}

int Queen( )  // 基于回溯法解决n皇后问题,补充参数定义
{
    int q[100],i,scheme[1000][100];
    int scheme_index=0;
    for(i=0; i<num; i++)    //把第i行全部置1

    {
        q[i]=1;
    }
    i=0;
    int c=0;
    while(i<num)
    {
        if (q[i]<=num)
        {
            int j=0;
            while((j<i)&&(q[j]!=q[i])&&(abs(q[j],q[i])!=abs(j,i)))
                j++;
            if(j<i)
            {
                q[i]=q[i]+1;
                system("cls");  // 清屏
                cout<<"移动步数为:"<<c++<<endl;
                print();
                Sleep(speed);
            }
            else
            {
                i++;
                system("cls");
                print();
                Sleep(speed);
            }
            if(i==num)
            {
                scheme_index++;
                c--;
                system("cls");
                cout<<"移动步数为:"<<c<<endl;
                print();

            }
        }
        else
        {
            q[i]=1;
            i--;
            c++;
            if (i<0)
                break;
            q[i]=q[i]+1;
        }
    }
    cout<<"共有"<<scheme_index<<"种方案!"<<endl;
}

int main()
{
    int num;
    cout<<"请输入皇后个数!\n";
    cin>>num;
    Queen(num);
    return 0;
}

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7807510
  • 你也可以参考下这篇文章:面试题:八皇后问题(N皇后问题)
  • 除此之外, 这篇博客: n皇后(单个解) 马周游问题 回溯法 分治法中的 代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <iostream>
    #include <memory.h>
    #include <stdlib.h>
    using namespace std;
    //下面代表对于规模的大小的棋盘的路径,其中保存来回路径方便遍历
    //保存的数字代表下一步的方向,8种方向用8个数字代表
    int ans6_6[6][6][2] = {
    {{3,4},{4,5},{3,6},{6,3},{4,6},{5,6}},
    {{2,3},{5,2},{2,7},{2,4},{5,7},{7,6}},
    {{1,4},{8,3},{7,8},{2,3},{4,1},{5,8}},
    {{4,1},{5,4},{6,3},{7,1},{8,4},{7,5}},
    {{3,2},{8,3},{3,6},{3,6},{7,1},{6,8}},
    {{2,1},{2,8},{8,7},{7,2},{1,7},{8,7}}};
    int ans6_8[6][8][2] = {
    {{3,4},{3,5},{6,3},{6,3},{3,5},{5,3},{6,4},{6,5}},
    {{3,2},{5,2},{5,7},{3,7},{7,2},{7,2},{4,7},{7,6}},
    {{1,4},{8,3},{4,7},{1,4},{4,1},{2,7},{1,4},{8,5}},
    {{4,1},{5,1},{6,5},{7,5},{5,6},{5,4},{6,4},{5,8}},
    {{3,2},{8,3},{2,6},{3,8},{8,2},{3,8},{1,6},{8,6}},
    {{2,1},{1,8},{1,7},{7,1},{2,1},{2,7},{8,1},{8,7}}};
    int ans8_8[8][8][2] = {
    {{3,4},{4,5},{6,4},{3,6},{4,6},{6,3},{4,6},{5,6}},
    {{4,2},{2,5},{2,7},{5,2},{2,5},{2,7},{4,5},{7,6}},
    {{1,4},{8,5},{6,8},{8,4},{4,3},{2,8},{4,1},{5,8}},
    {{1,2},{4,8},{4,1},{1,3},{6,5},{1,3},{7,4},{5,8}},
    {{1,4},{8,5},{6,2},{3,4},{8,5},{7,8},{4,1},{7,8}},
    {{4,2},{4,5},{3,8},{1,8},{3,4},{4,7},{4,1},{8,5}},
    {{1,3},{8,3},{6,3},{1,6},{8,7},{6,3},{6,7},{6,8}},
    {{1,2},{2,8},{7,8},{7,2},{7,2},{8,2},{1,8},{7,8}}};
    int ans8_10[8][10][2] = {
    {{3,4},{3,5},{6,3},{3,6},{3,6},{5,6},{6,3},{3,6},{4,6},{5,6}},
    {{3,2},{2,5},{2,7},{2,7},{7,2},{2,7},{2,7},{2,3},{7,4},{5,7}},
    {{1,3},{8,5},{5,7},{5,6},{3,1},{3,5},{4,6},{5,4},{4,1},{7,8}},
    {{1,4},{2,4},{7,4},{5,3},{2,4},{4,6},{3,7},{6,7},{4,1},{8,6}},
    {{1,4},{5,1},{6,1},{2,4},{1,3},{7,2},{6,1},{2,8},{8,7},{5,8}},
    {{4,2},{8,5},{8,1},{8,5},{4,2},{8,6},{7,8},{3,4},{6,4},{5,8}},
    {{3,1},{8,3},{6,3},{2,6},{8,3},{6,3},{6,2},{3,6},{6,1},{6,7}},
    {{1,2},{2,8},{1,7},{7,2},{7,2},{2,8},{7,2},{7,2},{8,1},{8,7}}};
    int ans10_10[10][10][2] = {
    {{3,4},{3,5},{4,6},{5,3},{3,6},{5,6},{4,6},{6,3},{4,6},{5,6}},
    {{2,3},{5,3},{2,7},{2,7},{2,4},{7,2},{2,7},{2,3},{4,5},{7,5}},
    {{1,3},{8,5},{7,1},{7,8},{3,1},{6,5},{4,5},{5,8},{4,1},{7,8}},
    {{3,1},{4,5},{7,5},{4,2},{4,3},{8,3},{3,7},{1,5},{1,4},{5,8}},
    {{1,4},{3,4},{6,7},{4,3},{1,5},{1,4},{7,1},{7,8},{5,7},{5,8}},
    {{1,2},{1,5},{6,8},{4,7},{6,8},{7,8},{1,5},{5,6},{5,1},{8,6}},
    {{4,2},{8,5},{8,2},{1,6},{4,8},{2,6},{8,6},{2,1},{4,1},{5,6}},
    {{1,4},{2,5},{5,4},{2,6},{2,8},{1,6},{5,1},{2,1},{4,5},{5,6}},
    {{1,3},{2,8},{6,3},{2,3},{6,3},{6,8},{6,3},{2,3},{6,1},{6,8}},
    {{1,2},{8,1},{7,2},{8,2},{7,2},{7,1},{7,2},{1,2},{7,1},{7,8}}};
    int ans10_12[10][12][2] = {
    {{3,4},{3,5},{5,6},{3,6},{4,5},{3,6},{4,6},{3,6},{3,5},{3,6},{4,5},{5,6}},
    {{2,4},{2,5},{6,7},{2,7},{2,5},{2,7},{5,6},{2,7},{4,5},{2,7},{4,7},{5,7}},
    {{1,2},{8,1},{6,5},{1,5},{2,3},{6,8},{5,4},{1,8},{6,4},{1,3},{4,1},{5,8}},
    {{1,2},{8,5},{4,3},{1,2},{6,3},{6,1},{7,2},{1,6},{6,4},{5,8},{4,1},{7,8}},
    {{3,4},{1,5},{1,2},{4,2},{7,3},{2,1},{7,2},{8,6},{3,5},{8,6},{4,1},{5,8}},
    {{1,3},{3,4},{6,7},{5,8},{3,5},{2,5},{7,6},{2,5},{4,1},{8,5},{6,7},{5,8}},
    {{1,2},{8,5},{7,6},{4,7},{2,8},{3,5},{6,7},{1,3},{6,2},{3,4},{4,1},{5,8}},
    {{2,4},{4,5},{8,1},{1,6},{1,2},{5,4},{1,2},{4,7},{1,6},{7,8},{4,1},{5,7}},
    {{1,3},{2,3},{6,3},{6,3},{1,8},{6,3},{2,3},{6,3},{6,3},{6,3},{8,1},{6,8}},
    {{1,2},{8,2},{7,8},{7,2},{7,1},{7,2},{8,2},{7,2},{7,8},{7,2},{7,1},{7,8}}};
    //ceshi数组储存棋盘的往下走的方向变量,sign作为标记数组作为调转的中间变量
    //answer数组存储由ceshi数组转换为的顺序数组
    int ceshi[1005][1005], sign[1005][1005];
    int answer[1005][1005];
    //cheng_area输入x,y的范围,用来调转矩阵的方向
    void change_area(int x_low, int x_high, int y_low, int y_high)
    {
        for(int tmpa = x_low; tmpa <= x_high; tmpa++)
            for(int tmpb = y_low; tmpb <= y_high;tmpb++)
            {
            if(ceshi[tmpa][tmpb] == 1)
                sign[tmpa - 2][tmpb + 1] = 5;
            if(ceshi[tmpa][tmpb] == 2)
                sign[tmpa - 1][tmpb + 2] = 6;
            if(ceshi[tmpa][tmpb] == 3)
                sign[tmpa + 1][tmpb + 2] = 7;
            if(ceshi[tmpa][tmpb] == 4)
                sign[tmpa + 2][tmpb + 1] = 8;
            if(ceshi[tmpa][tmpb] == 5)
                sign[tmpa + 2][tmpb - 1] = 1;
            if(ceshi[tmpa][tmpb] == 6)
                sign[tmpa + 1][tmpb - 2] = 2;
            if(ceshi[tmpa][tmpb] == 7)
                sign[tmpa - 1][tmpb - 2] = 3;
            if(ceshi[tmpa][tmpb] == 8)
                sign[tmpa - 2][tmpb - 1] = 4;
            }
        for(int tmpa = x_low; tmpa <= x_high; tmpa++)
            for(int tmpb = y_low; tmpb <= y_high;tmpb++)
                ceshi[tmpa][tmpb] = sign[tmpa][tmpb];
    }
    //找到与其对应的数组将方向填入ceshi数组中
    void marry(int x_low, int x_high, int y_low, int y_high)
    {
        int x_dif = x_high - x_low + 1;
        int y_dif = y_high - y_low + 1;
        if(x_dif == 6)
            if(y_dif == 6)
            {
                for(int tmpa = x_low; tmpa <= x_high; tmpa++)
                    for(int tmpb = y_low; tmpb <= y_high; tmpb++)
                        ceshi[tmpa][tmpb] = ans6_6[tmpa - x_low][tmpb - y_low][0];
            }
            else if(y_dif == 8)
            {
                for(int tmpa = x_low; tmpa <= x_high; tmpa++)
                    for(int tmpb = y_low; tmpb <= y_high; tmpb++)
                        ceshi[tmpa][tmpb] = ans6_8[tmpa - x_low][tmpb - y_low][0];
            }
        if(x_dif == 8)
            if(y_dif == 6)
            {
                for(int tmpa = 0; tmpa <= x_high - x_low; tmpa++)
                    for(int tmpb = 0; tmpb <= y_high - y_low; tmpb++)
                    {
                        ceshi[x_low + tmpa][y_high - tmpb] = ans6_8[tmpb][tmpa][0] + 2;
                        if(ceshi[x_low + tmpa][y_high - tmpb] > 8)
                            ceshi[x_low + tmpa][y_high - tmpb] -= 8;
                    }
            }
            else if(y_dif == 8)
            {
                for(int tmpa = x_low; tmpa <= x_high; tmpa++)
                    for(int tmpb = y_low; tmpb <= y_high; tmpb++)
                        ceshi[tmpa][tmpb] = ans8_8[tmpa - x_low][tmpb - y_low][0];
            }
            else if(y_dif == 10)
            {
                for(int tmpa = x_low; tmpa <= x_high; tmpa++)
                    for(int tmpb = y_low; tmpb <= y_high; tmpb++)
                        ceshi[tmpa][tmpb] = ans8_10[tmpa - x_low][tmpb - y_low][0];
            }
        if(x_dif == 10)
            if(y_dif == 8)
            {
                for(int tmpa = 0; tmpa < x_dif; tmpa++)
                    for(int tmpb = 0; tmpb < y_dif; tmpb++)
                    {
                        ceshi[x_low + tmpa][y_high - tmpb] = ans8_10[tmpb][tmpa][0] + 2;
                        if(ceshi[x_low + tmpa][y_high - tmpb] > 8)
                            ceshi[x_low + tmpa][y_high - tmpb] -= 8;
                    }
            }
            else if(y_dif == 10)
            {
                for(int tmpa = x_low; tmpa <= x_high; tmpa++)
                    for(int tmpb = y_low; tmpb <= y_high; tmpb++)
                        ceshi[tmpa][tmpb] = ans10_10[tmpa - x_low][tmpb - y_low][0];
            }
            else if(y_dif == 12)
            {
                for(int tmpa = x_low; tmpa <= x_high; tmpa++)
                    for(int tmpb = y_low; tmpb <= y_high; tmpb++)
                        ceshi[tmpa][tmpb] = ans10_12[tmpa - x_low][tmpb - y_low][0];
            }
        if(x_dif == 12)
            if(y_dif == 10)
            {
                for(int tmpa = 0; tmpa < x_dif; tmpa++)  //12
                    for(int tmpb = 0; tmpb < y_dif; tmpb++)  //10
                    {
                        ceshi[x_low + tmpa][y_high - tmpb] = ans10_12[tmpb][tmpa][0] + 2;
                        if(ceshi[x_low + tmpa][y_high - tmpb] > 8)
                            ceshi[x_low + tmpa][y_high - tmpb] -= 8;
                    }
            }
    }
    //分治,将棋盘规模大的划分成小的
    void dp(int x_low, int x_high, int y_low, int y_high)
    {
        int x_dif = x_high - x_low + 1;
        int y_dif = y_high - y_low + 1;
        //若长和宽之和大于22,则需要分治成四份小的棋盘进行计算
        if(y_dif + x_dif <= 22)
        {
            marry(x_low,x_high,y_low,y_high);
            return;
        }
        int x_mid, y_mid;
        if(x_dif % 4 == 0)
            x_mid = x_low + x_dif/2;
        else
            x_mid = x_low + x_dif/2 + 1;
        if(y_dif % 4 == 0)
            y_mid = y_low + y_dif/2;
        else
            y_mid = y_low + y_dif/2 + 1;
        dp(x_low, x_mid - 1, y_low, y_mid - 1);
        dp(x_low, x_mid - 1, y_mid, y_high);
        dp(x_mid, x_high, y_low, y_mid - 1);
        dp(x_mid, x_high, y_mid, y_high);
        //将四块棋盘调整方向,让他们可以和上面的图一样可以结合到一起
        if(ceshi[x_mid - 2][y_mid - 1] != 6)
            change_area(x_low, x_mid - 1, y_low, y_mid - 1);
        if(ceshi[x_mid - 1][y_mid] != 1)
            change_area(x_low, x_mid - 1, y_mid, y_high);
        if(ceshi[x_mid + 1][y_mid] != 2)
            change_area(x_mid, x_high, y_mid, y_high);
        if(ceshi[x_mid][y_mid - 1] != 5)
            change_area(x_mid, x_high, y_low, y_mid - 1);
        //四块棋盘互相连接
        ceshi[x_mid - 2][y_mid - 1] = 2;
        ceshi[x_mid - 1][y_mid] = 3;
        ceshi[x_mid + 1][y_mid] = 6;
        ceshi[x_mid][y_mid - 1] = 7;
    }
    //由存储方向的棋盘数组,逐步转换为遍历顺序的answer数组
    void zhuanhuan(int a, int b,int step)
    {
        while(answer[a][b] == 0)
        {
            step++;
            answer[a][b] = step;
            if(ceshi[a][b] == 1)
            {
                a -= 2;
                b += 1;
            }
            else if(ceshi[a][b] == 2)
            {
                a -= 1;
                b += 2;
            }
            else if(ceshi[a][b] == 3)
            {
                a += 1;
                b += 2;
            }
            else if(ceshi[a][b] == 4)
            {
                a += 2;
                b += 1;
            }
            else if(ceshi[a][b] == 5)
            {
                a += 2;
                b -= 1;
            }
            else if(ceshi[a][b] == 6)
            {
                a += 1;
                b -= 2;
            }
            else if(ceshi[a][b] == 7)
            {
                a -= 1;
                b -= 2;
            }
            else if(ceshi[a][b] == 8)
            {
                a -= 2;
                b -= 1;
            }
        }
    }
    int main()
    {
        //取消关联加速输出
        std::ios::sync_with_stdio(false);
        //初始化数组
        for(int tmp = 0; tmp < 1000; tmp++)
        {
            memset(answer[tmp],0,sizeof(answer[tmp]));
            memset(ceshi[tmp],0,sizeof(ceshi[tmp]));
        }
        int length, x_len, y_len;
        cin >> length >> x_len >> y_len;
        length--;
        dp(0,length, 0,length);
        zhuanhuan(x_len - 1, y_len - 1,0);
        for(int tmpa = 0; tmpa <= length; tmpa++)
        {
            for(int tmpb = 0; tmpb <= length; tmpb++)
                cout <<  answer[tmpa][tmpb] << " ";
            cout <<endl;
        }
    }
    

    小声讲一句, 我自己都看不懂自己的代码