【组队赛#5】BNU 4299 God Save the i-th Queen (数组映射)

【题目链接】click here~~

【题目大意】给你一个N*M的棋盘,并且给定T个已经固定位置的皇后(横坐标,纵坐标已知),求下一个合法放置皇后的可能数

【解题思路】

因为只是求下一个皇后的位置,而不是求所有其他可能,因此可以按照如下思路进行:

 对n*n的矩阵进行映射,将其转换为1*(n+m)的单行模式。

1、行列可以直接映射。

2、对于对角线有两种情况(画图验证)

1.1.映射为x+y模式(一三区间)

2..1映射为x-y+Y模式(二四区间)  (注意!前面的x是映射的行,Y后才是列)

代码

/*
   Author:HRW
    对n*n的矩阵进行映射,将其转换为1*(n+m)的单行模式。
    1、行列可以直接映射。
    2、对于对角线有两种情况(画图验证)
         1.映射为x+y模式(一三区间)
         2.映射为x-y+Y模式(二四区间)  (注意!前面的x是映射的行,Y后才是列)
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 30000 + 10;
int usedx[maxn], usedy[maxn], usedl[maxn+maxn],usedr[maxn+maxn];
//int shuru()
//{
//    int sum=0;
//    char ch;
//    while((ch=getchar())<'0'||ch>'9'); sum=ch-'0';
//    while((ch=getchar())>='0'&&ch<='9') sum=sum*10+ch-'0';
//    return sum;
//}
int main()
{
    int X,Y,N;
    while(cin >> X >> Y >> N,X)
    {
        memset(usedl,0,sizeof(usedl));
        memset(usedr,0,sizeof(usedr));
        memset(usedx,0,sizeof(usedx));
        memset(usedy,0,sizeof(usedy));
        for(int i = 0; i < N; ++i){
            int x,y;
            cin>>x>>y;
            ++usedx[x];    //映射行
            ++usedy[y];  //映射列
            ++usedl[Y+x-y]; //2,4区间
            ++usedr[x+y]; //1,3区间
        }
        LL ans = 0;
        for(int i = 1; i <= X; ++i){
            for(int j = 1; j <= Y; ++j){
                if(!usedx[i] && !usedy[j] && !usedl[i-j+Y] && !usedr[i+j])  ans++;
            }
        }
        cout << ans << endl;
    }
    return 0;
}
时间: 2024-12-16 01:13:46

【组队赛#5】BNU 4299 God Save the i-th Queen (数组映射)的相关文章

BNUOJ 4299 God Save the i-th Queen(想法题)

题目链接==>    http://www.bnuoj.com/v3/problem_show.php?pid=4299 题意:一个X*Y棋盘上放了N个queens,再放一个queen,有几个空格可以放,前提是和已经在棋盘上的queen不同行不同列不同斜线 思路:每个点所在四条直线上,不能再放queen,所以将有点的直线标记,再遍历所有点,如果点所在直线已被标记,则不选.(完了) 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #

网御防火墙日常管理操作

串口命令行命令介绍ac>system show   (显示系统信息防火墙序列号.版本号)ac>interface show all (显示所有网络端口的ip)ac>interface set phy if fe3 ip 1.1.1.1 netmask 255.255.255.0 active on admin on ping on  (设定fe3的ip为1.1.1.1/255.255.255.0 允许管理.ping)ac>admhost show (查看管理主机ip)ac>a

TP框架中 数据库的增删改查

框架会用到数据库的内容,这一篇就是关于数据库的增删改查. 数据库的操作,无疑就是连接数据库,然后对数据库中的表进行各种查询,然后就是对数据的增删改的操作, 想要操作数据库,第一步必然是要:链接数据库 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件 我这里是这样的文件路径 (2)打开这个config.php文件,然后找到父类配置文件convention.php文件,将关于"数据库"的部分复制粘贴到config.php配置文件中(父类的conv

ThinkPHP的CURD操作

CURD:create(创建).update(更新).read(读取).delete(删除) 1.数据对象创建(create):  a.TP提供了create方法迅速的创建数据对象,可一自动的根据表单数据创建对象,支持数组,对象,甚至可以把一个数据对象创建给一个新的数据对象,如:    $User=M('User');    $User->name='ThinkPHP';    $User->email='[email protected]';    $Member=M('Member'); 

OSG开源教程(转)

整理:荣明.王伟 北 京 2008年4月 序 第一次接触OSG是在2001年,当时开源社区刚刚兴起,还没有现在这么火.下载了OSG源码,但是在看了几个Demo之后,感觉没有什么特别之处.时隔七年之后,我再次将目光投向OSG,发现OSG确实有其独到之处,很多3D效果已经不弱于甚至超过商业软件,有感于开源力量的巨大.但是,与当前主流3D商业软件如Vega.VegaPrime.VTree.Performer等相比,开源软件的缺点也很明显,其中文档缺乏可谓其致命弱点之一.开发者只能从浩瀚的源码中,进行编

php遍历目录输出目录及其下的所有图片文件

在做网站的时候,需要给文章内所有的图片添加上logo,如何利用ThinkPHP来实现. ThinkPHP为我们很好的提供了图像处理类,给文章中的所有图片加上水印的思路,上传的图片文件都保存在一个文件夹下面,我只需要获取该文件夹以及子文件夹下面的所有图片,遍历一次,加上水印即可,因此目前的难度只是怎么获取文件中的图片,并且遍历一次即可.[在ImagesController控制器中具体会出现二维数组的遍历]:因此添加水印的图片问题就转换成了利用PHP遍历目录输出目录及其下的所有图片文件 //遍历目录

背包问题---递归及动态规划

一.原题 如果有一组物品,各个物品的质量已知,现有一个背包,背包可以容纳的质量总和S已知,问是否能从这N个物品中取出若干个恰好装入这个背包中. 二.递归算法 本质思想:设法尝试全部组合,当部分组合已经无法满足条件时,马上停止当前组合的尝试:若出现第一个满足条件的组合,马上停止尝试.使用递归回溯法实现.(感觉这东西不是我这样的菜鸟可以说明确的,还得自己慢慢体会,最好的方法就是耐住性子跟踪调试). 上"酸菜" #include <stdio.h> #include <st

Cocos2d-X直接使用OpenGL接口

Cocos2d-X是基于基于OpenGL ES的2D游戏引擎,所以Cocos2d-X能够直接使用OpenGL接口 首先建立一个Draw类,用于处理OpenGL接口 在Draw.h中加入以下的代码 #ifndef _Draw_H_ #define _Draw_H_ #include "cocos2d.h" USING_NS_CC; class Draw : public CCLayer { public: static CCScene* scene(); CREATE_FUNC(Draw

Hibernate 配置 双向 对多关联 (未完待续&#183;&#183;&#183;&#183;&#183;&#183;&#183;)

               从生疏到熟练  是要经历多少遍的练习? 这答案只能向自己找. 以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 首先  我们创建持久化类Student 1 package bean; 2 3 import java.util.Set; 4 5 public class Student { 6 private long id; 7 private String name;//学生姓名 8 private Set<Course>