红娜栗sa 2022-02-28 21:46 采纳率: 50%
浏览 20

蓝桥杯关于2N皇后求解问题

遇到的问题

img


这是网上一个关于蓝桥杯2N皇后的解答,大致思路都懂了,就是图中回溯值置为1那里,利用递归方法解决,圈出来的地方不是没有运行吗,怎么置为1呢?
下面是完整代码:
#include
using namespace std;
int queen[8][8];
int n;
int sum=0;
void queen2(int line);//白子
bool check(int line,int list,int a);//检查此处是否可以放置棋子
void queen1(int line);//黑子
int main()
{

cin >> n;
for(int i = 0;i < n;i ++)
{
    for(int j = 0;j < n;j ++)
    {
        cin >> queen[i][j];
    }
}
queen1(0);
cout << sum;

return 0;

}
//0--不可以放置,1--是可以放置,2--是放置黑子 ,3--是放置白子
bool check(int line,int list,int a)
{
int i,j;
if(queen[line][list] != 1) return false;//要检查的位子为line行list列,若此处初始值不为1则不可以放置棋子

else//line行list列处初始值为1 
{
    
    for(i = 0;i < line;i ++)//遍历line行之前的行数 
    {
        if(queen[i][list] != a)//若list列上没有相同的子 
        {
            for(j = 0;j < n;j ++)//继续遍历i行 
            {
                if(queen[i][j] == a )//如果i行j列上有相同的子 (a=2为黑子,a=3为白子) 
                if(  line + list == i + j || line - list == i - j)//并且i行j列上面的子与要判断的位置line行list列在对角线上 
                    return false;//返回false,即line行list列不可放置 
            }
        
        }
        else if(queen[i][list] == a) return false;//list列上有相同的子,返回false 
    
}
}

return true;//检查无误,返回true 

}

void queen1(int line)
{
int j;

for(j = 0;j < n;j ++)
{
    if(queen[line][j] == 1 && check(line,j,2))//如果i行j列为1,并且检查无互相攻击表示可以放置 
    {
        queen[line][j] = 2;//则放置黑子,数字为2 
        
        if(line == n-1)//黑子在棋盘上放完 
        {
            queen2(0);//开始放白子 
            queen[line][j] = 1;//回溯之后值置1 
            return ;
        }
        queen1(line + 1);
        queen[line][j] = 1;//回溯之后值置1 
    }
}

return ;

}

void queen2(int line)
{

int j;
for(j = 0;j < n;j ++)
{
    if(queen[line][j] == 1 && check(line,j,3))//如果i行j列为1,并且检查无互相攻击表示可以放置 
    {
        queen[line][j] = 3;//则放置白子,数字为3
        if(line == n - 1)
        {
            sum ++;
            queen[line][j] = 1;
            return ;
        }
        queen2(line + 1);
        queen[line][j] = 1;//还原 
    }
}
return ;

}

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-03-01 13:27
    关注

    “给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
    递归函数关注以下几个因素
    ·退出条件
    ·参数有哪些
    ·返回值是什么
    ·局部变量有哪些
    ·全局变量有哪些
    ·何时输出
    ·会不会导致堆栈溢出

    评论

报告相同问题?

问题事件

  • 创建了问题 2月28日

悬赏问题

  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 更换了一个新的win10系统,再下载VS时碰到的问题,是C++组件的?
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线
  • ¥20 无法创建新的堆栈防护界面
  • ¥15 sessionStorage在vue中的用法
  • ¥15 wordpress更换域名后用户图片头像不显示
  • ¥15 如何在ubunto上安装CEF (Chromium Embedded Framework),并且基于qt实现打开一个web