1128 N Queens Puzzle 自练&大神代码

本文介绍了一种用于判断皇后图是否满足攻防条件的算法,通过数组存储皇后位置,检查行、列及斜对角线上的冲突,适用于编程竞赛及算法研究。

自练代码:

#include<bits/stdc++.h> //·½·¨ÓÐÎó£¡ 
using namespace std;
const int maxn=1005;
int k;
int main(){
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		int n,is=1;
		int ans[maxn]={0};
		scanf("%d",&n);
		for(int j=1;j<=n;j++){
			scanf("%d",&ans[j]);
		}
		for(int j=1;j<=n;j++){
			for(int g=1;g<=n;g++){
				if(j==g) continue;
				if(abs(ans[j]-ans[g])==abs(j-g)) {
					is=0;
					printf("No\n");
					j=n+1;
					break;
				}
			}
		}
		if(is==1) printf("Yes\n");
	}
	return 0;
}

某位大神(薛玉洁)代码:

//题目大意:给出一个皇后图,以这样的方式给出:
//一个数组包含n个数字,每个数字表示该列的皇后所在的行数~
//判断给出的皇后图是否满足不会互相攻击
//(任意两个皇后都要不在同一行或者同一列,且不在斜对角线上~)
//分析:用v[n]存储一张图给出的数字~对于第j个数字,
//判断前0~j-1个数字中是否有在同一行的(v[j] == v[t])和
//在斜对角线上的(abs(v[j]-v[t]) == abs(j-t))
//【因为已经告诉肯定不在同一列了,所以不需要判断是否在同一列啦~】
//如果发现了不满足的情况,就将result由true标记为false~
//最后根据result是true还是false输出对应的YES还是NO即可~
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
    int k, n;
    cin >> k;
    for (int i = 0; i < k; i++) {
        cin >> n;
        vector<int> v(n);
        bool result = true;
        for (int j = 0; j < n; j++) {
            cin >> v[j];
            for (int t = 0; t < j; t++)
                if (v[j] == v[t] || abs(v[j]-v[t]) == abs(j-t)) result = false;
        }
        cout << (result == true ? "YES\n" : "NO\n");
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值