【计算机算法设计与分析】7-6 皇后控制问题(C++_拉斯维加斯算法(Las Vegas))

博客围绕在nxn方格棋盘上放置皇后的问题展开。要使皇后控制所有方格且互不攻击,需计算最少放置数量。采用拉斯维加斯算法,该算法为随机化算法,约束随机数使皇后互不攻击,随机计算10000次以找到最小解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在一个nxn个方格组成的棋盘上的任一方格中放置一个皇后,该皇后可以控制他所在 的行,列以及对角线上的所有方格。对于给定的自然数n,在nxn个方格组成的棋盘上最少要放置多少个皇后才能控制棋盘上的所有方格,且放置的皇后互不攻击?
设计一个拉斯维加斯算法,对于给定的自然数n计算在nxn个方格组成的棋盘上最少要放置多少个皇后才能控制棋盘上的所有方格,且放置的皇后互不攻击。

思路解析

所谓拉斯维加斯算法即为随机化算法,但是为了保证结果的切实可行,约束随机数必须满足皇后互不攻击的条件,因为并不是每一行都必须有一个皇后,所以随机数可以为0,在整个棋盘随机化结束后判定是否全部控制棋盘,若true,则比对最小值更新答案,否则不更新。因为随即化算法的正确率并不高,所以设定其随机计算10000次,以期找到最小数量的皇后的解。

Code

#include<bits/stdc++.h>
using namespace std;
#define N 100
#define M 50
int n;
int min_ans=0x3f3f3f, ans[N]; 
bool judge_crl(int row[N], int col[N], int rl[N], int lr[N]){//判断皇后是否完全控制棋盘
    for(int x=1;x<=n;x++){
        for(int y=1;y<=n;y++){
            if(row[x]||col[y]||rl[x+y]||lr[M+x-y]){
                continue;
            }else{
                return false;
            }
        }
    }
    return true;
}
int main()
{
    srand(0);
    cin>>n;
    for(int i=0;i<10000;i++){//计算次数
        int num=0;
        int row[N]={0}, col[N]={0}, rl[N]={0}, lr[N]={0}, vis[N]={0};
        for(int x=1;x<=n;x++){//每行的方案
            while(true){
                int y=rand()%(n+1);//[0, n]
                if(!y){
                    vis[x]=0;
                    break;
                }
                if(!col[y]&&!rl[x+y]&&!lr[M+x-y])//该点可行
                {
                    num++;
                    vis[x]=y;
                    row[x]=1;
                    col[y]=1;
                    rl[x+y]=1;
                    lr[M+x-y]=1;
                    break;
                }
            }
        }
        if(judge_crl(row, col, rl, lr)&&num<min_ans){//更新方案
            min_ans=num;
            for(int i=1;i<=n;i++){
                ans[i]=vis[i];
            }
        }
    }
    cout<<min_ans<<endl;
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<" ";
    getchar();
    getchar();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaoql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值