ZOJ-搜索专题

news2024/9/29 17:57:41

1002

  • 题意
    在这里插入图片描述
    在这里插入图片描述
  • 思路

深搜,每个格子都搜一遍。技巧dfs(cnt,ans)dfs(第几个格子,答案);

  • 代码
#include <iostream>

using namespace std;

int n,i,j,ans;
char s[5][5];

int c_put(int n,int  m)
{
    for (i = n-1;i >= 0;i --) {
        if (s[i][m] == 'O')
            return 0;
        if (s[i][m] == 'X') 
            break;
    }
    for (j = m-1;j >= 0;j --) {
        if (s[n][j] == 'O')
            return 0;
        if (s[n][j] == 'X')
            break;
    }
    return 1;
}

void dfs(int k,int num)
{
    int x,y;
    if (k == n*n) {
        if (num > ans) {
            ans = num;
        }
        return ;
    }
    else {
        x = k/n;
        y = k%n;
        if (s[x][y] == '.'&&c_put(x,y)) {
            s[x][y] = 'O';
            dfs(k+1,num+1);
            s[x][y] = '.';
        }
        dfs(k+1,num);
    }
}
int main()
{
    while (cin>>n&&n) {
        ans = 0;
        for (i = 0;i < n; i++) {
            for (j = 0;j < n;j ++) 
                cin>>s[i][j];
        }
        dfs(0,0);
        cout<<ans<<endl;
    }
    return 0;
}

1003

  • 题意

在每年的6月1日儿童节,电视上都会有一个名为 "撞气球 "的游戏。 规则非常简单。 地上有100个贴有标签的气球,数字为1到100。 在裁判员喊出 "开始吧!"之后,两位选手开始时的分数都是 “1”,他们竞相用脚去撞气球,同时,他们的分数要乘以他们所撞气球上写的数字。 一分钟后,小观众们被允许把剩下的气球拿走,每个参赛者报告他/她的分数,即他/她撞破的气球上的数字的乘积。 非官方的赢家是宣布最高分数的选手。
但不可避免的是,会出现争议,因此在争议解决之前,不会确定正式的赢家。 声称分数较低的选手有权质疑其对手的分数。 得分较低的选手被认为是说了实话,因为如果他(她)要对自己的分数撒谎,他(她)肯定会想出一个更大更好的谎言。 如果分数较高的玩家的分数不能被挑战者撞碎的气球所达到,则挑战成功。 因此,如果挑战成功,声称分数较低的玩家获胜。

因此,例如,如果一个玩家声称得到343分,另一个声称得到49分,那么显然第一个玩家在撒谎;得到343分的唯一方法是撞毁标有7和49的气球,而得到49分的唯一方法是撞毁标有49的气球。 由于这两个分数都需要撞毁标有49的气球,那么声称得到343分的人就被认为是在撒谎。

另一方面,如果一个人声称得了162分,另一个人声称得了81分,那么两个人都有可能说的是实话(例如,一个人撞坏了2、3和27号气球,而另一个人撞坏了81号气球),所以挑战不会被支持。

顺便说一下,如果挑战者在计算他/她的分数时犯了一个错误,那么挑战将不会被支持。例如,如果一个玩家声称10001分,另一个声称10003分,那么显然他们都没有说实话。在这种情况下,挑战将不会被支持。

不幸的是,任何愿意担任撞气球游戏裁判的人都有可能在炎热的气氛中过度兴奋,不能合理地期望她进行裁判所需的复杂计算。 因此,需要你,清醒的程序员,提供一个软件解决方案。

  • 思路
    搜索,看看a,b假设a>b;是否都能够得到,如果a不能,那么就是b胜。
    否则就是a胜
    关键代码:
if (b == 1) {
        bTrue = 1;
        if (a == 1) aTrue = 1;
 }

这样aTrue 判断是在b(小数)已经可以的情况下。

  • 代码
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

bool aTrue,bTrue;

void judge(int a,int b,int  p)
{
    if (b == 1) {
        bTrue = 1;
        if (a == 1) aTrue = 1;
    }
    if (p == 1||(aTrue == 1&&bTrue == 1))
        return ;
    if (a%p == 0)
        judge(a/p,b,p-1);
    if (b%p == 0) 
        judge(a,b/p,p-1);
    judge(a,b,p-1);
}

int main()
{
    int a,b;
    while (scanf("%d%d",&a,&b) != EOF) {
        if (a < b)
            swap(a,b);
        aTrue = false;
        bTrue = false;
        judge(a,b,100);
        if (!aTrue && bTrue) {
            printf("%d\n",b);
        } else {
            printf("%d\n",a);
        }
    }
}

1031

  • 题意

下面的左图是用2(34)(=24)根火柴棒做成的一个完整的33格。所有火柴棒的长度都是一。你可以在网格中找到许多不同大小的正方形。一个正方形的大小就是它的边的长度。在左图所示的网格中,有9个大小为1的正方形,4个大小为2的正方形,1个大小为3的正方形。

如左图所示,完整的网格中的每根火柴棒都有一个独特的编号,从左到右、从上到下分配。如果你从完整的网格中抽出一些火柴棒,那么网格中的一些方格就会被破坏,这就导致了一个不完整的33号网格。右图显示的是除去三根编号为12、17和23的火柴棒后的不完整的33网格。这一移除行为破坏了5个大小为1的方格,3个大小为2的方格,以及1个大小为3的方格。因此,这个不完整的网格没有大小为3的方格,但仍有4个大小为1的方格和1个大小为2的方格。
在这里插入图片描述
作为输入,你将得到一个由不超过2n(n+1)根火柴棍组成的(完整或不完整的)nn网格,而自然数n<=5。你的任务是计算取出的火柴棒的最小数量,以破坏输入的nn个网格中的所有方格。

  • 思路
    此问题可以转化为一个图论的问题,把火柴看作另A类结点,正方形看作B类结点。
    如果某根火柴在某个正方形的边上,那么我们就往这相应的两个结点添加一条边。
    这样,问题转化为求该图中,最少用多少A类结点可以覆盖所有的B类结点。
    当n=5时,A类结点数为:2n(n+1)=60;B类结点数为:n(n+1)(2n+1)/6=55。
    可以见得,B类结点可以直接通过一个64位整型类储存。利用位运算,可以大大加快搜索速度。做法具体如下:
    (1) 若有边(i, j)(分别属于A、B类结点,下同),则Aij = 0;否则Aij = 1;
    (2) 对于每个确定的i,将Aij二进制编码至Bi中;
    (3) 除去数据中没有的Bi,并编码初始状态st;
    (4) 对于Bi按照可覆盖点数排序(优化1);
    (5) 若i<j,且Bi和Bj效果是一致的,则删掉Bj(优化2);
    (6) 计算opt[i] = Bi & B(i+1) & B(i+2) … & Bn(可行性剪枝)。
    搜索过程,按照一般的方法做即可,添加最优性剪枝:若当前值大于阶段最剪枝,则跳出;
    添加可行性剪枝,若取剩余所有的Bi也无法达到目标,则剪枝。
  • 代码
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

long long rest,cover[60],remain[60];

int Size,cnt,ans;
int up[6][6];
bool stick[60];

void initUP()
{
    int i,j;
    for (i = 0;i < Size;i ++) {
        up[i][0] = i*(Size*2+1);
        for(j = 1;j < Size;j ++) {
            up[i][j] = up[i][j-1] + 1;
        }
    }
}

void initCover(int firststick,int sqsize,long long mask)
{
    int i;
    int gap = 2*Size+1;
    int num = firststick;
    for (i = 0;i < sqsize;i ++) {
        cover[num] |= mask;
        cover[num+sqsize*gap] |= mask;
        num ++;
    }
    num = firststick + Size;
    for (i = 0;i < sqsize;i ++) {
        cover[num] |= mask;
        cover[num+sqsize] |= mask;
        num = num + gap;
    }
}

void input()
{
    int i,j,k,n;cin>>Size;
    initUP();
    cin>>cnt;
    memset(stick,true,sizeof(stick));
    for (i = 0;i < cnt;i ++) {
        cin>>n;
        stick[n-1] = false;
    }
    long long mask = 1;
    memset(cover,0,sizeof(cover));
    for (i = 1;i <= Size;i ++) {
        for (j = 0;j <= Size-i;j ++) {
            for (k = 0;k <= Size-i;k ++) {
                initCover(up[j][k],i,mask);
                mask<<=1;
            }
        }
    }
}

void modify()
{
    int i,j,rec;
    rec = Size*(Size+1)*(2*Size+1)/6;
    rest = 1;
    for (i = 1;i < rec;i ++) {
        rest <<= 1;
        rest += 1;
    }
    cnt = 2*Size*(Size+1);
    for (i = 0;i < cnt ;i ++) {
        if (!stick[i]) rest &= ~cover[i];
    }
    for (i = 0;i < cnt;i ++) {
        cover[i] &= rest;
    }
    for (i = 0;i < cnt;i ++) {
        if (!stick[i]) continue;
        else {
            for (j = 0;j < cnt;j ++) {
                if (j != i&&((cover[i]&cover[j]) == cover[j]))
                    stick[j] = false;
            }
        }
    }
    int c = 0;
    for (i = 0;i < cnt;i ++) {
        if (stick[i]) {
            cover[c ++]  = cover[i];
        }
    }
    cnt = c;
    remain[cnt -1 ] = cover[cnt - 1];
    for (i = cnt-2;i >= 0;i --) {
        remain[i] = remain[i+1]|cover[i];
    }
}

void dfs(int c,int last,long long state) 
{
    if (state == rest) {
        ans = c;return;
    } else {
        if (c < ans&&(remain[last+1]|state) == rest) {
            for (int i = last+1;i < cnt;i ++) {
                if ((cover[i]|state)>state) {
                    dfs(c+1,i,state|cover[i]);
                }
            }
        }
    }
}

int main()
{
    int num;
    cin>>num;
    while (num --) {
        input();modify();
        ans = 30;
        dfs(0,-1,0);
        cout<<ans<<endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么解决SPA首屏加载速度慢?

首屏加载 首屏时间&#xff08;First Contentful Paint&#xff09;&#xff0c;指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首屏加载可以说是用户体验…

LeetCode第2577题-在网格图中访问一个格子的最少时间-python实现-图解思路与手撕代码

LeetCode第2577题-在网格图中访问一个格子的最少时间-python实现-图解思路与手撕代码 文章目录一、题目描述二、解题思路与代码实现1.解题思路2.代码实现总结一、题目描述 二、解题思路与代码实现 1.解题思路 这道题求最短距离&#xff0c;首先检查起始点0,0的右边0,1和下边1…

Linux配置mysql主从复制

Linux配置mysql主从复制 systemctl restart mysqld 重启mysql服务 Mysql主从复制 在linux里面部署mysql 主库Master 192.168.162.138 contos 7 从库Slave 192.168.162.137 contos 7测试 log-binmysql-bin町[必须]启用二进制日志 第三步:登录Mysql数据库&#xff0c;执…

oracle 19c 创建物化视图并测试logminer进行日志挖掘

1、创建物化视图 alter session set containerpdb; grant create materialized view to scott; create materialized view 物化视图名 -- 1. 创建物化视图 build [immediate | deferred] -- 2. 创建方式&#xff0c;默认 immediate refre…

LeetCode-2373. 矩阵中的局部最大值【矩阵,数组】

LeetCode-2373. 矩阵中的局部最大值【矩阵&#xff0c;数组】题目描述&#xff1a;解题思路一&#xff1a;原地修改。首先将每个3*3的矩阵的最大值存放在左上角的点&#xff0c;然后修改给的grid矩阵的大小。解题思路二&#xff1a;暴力&#xff0c;申请一个数组解题思路三&…

想学Java开发,有什么方式可以选择?

想学习软件开发Java高级编程语言的小伙伴看过来&#xff0c;这里有多年Java职业教育经验总结以及学习技巧分享&#xff0c;不容错过的精彩内容&#xff01; 一年之计在于春&#xff0c;阳春三月是学习的好时光。万物复苏&#xff0c;一切都可以重新开始&#xff0c;如果你也在考…

一些开源的,好看的前端组件/样式库

以下是一些受欢迎的开源 CSS 样式库&#xff1a;Bootstrap&#xff1a;https://getbootstrap.com/Materialize CSS&#xff1a;https://materializecss.com/Bulma&#xff1a;https://bulma.io/Foundation&#xff1a;https://foundation.zurb.com/Semantic UI&#xff1a;http…

智慧燃气管理系统

在数字经济时代&#xff0c;迫切需要通过数字化建设智能天然气&#xff0c;提高天然气的基本安全水平&#xff0c;提高企业的智能管理水平。这是人们可以看到、触摸和使用的智能应用&#xff0c;也是为智能城市奠定良好基础的必修课。智能燃气是以GIS为基础&#xff0c;采用物联…

商简智能计划与排程SPS在纺织行业中的应用

企业背景 某织造、染色及后整理一体化工艺的纺织面料企业&#xff0c;主要从事户外功能运动服装、内衣、泳衣、汽车内饰等面料的研发和销售&#xff0c;年产值在20亿左右&#xff0c;是迪卡侬运动面料最优质供应商之一。 纺织行业特点 印染具有典型的流程行业特性&#xff0c…

从功能测试到自动化测试,我只花了67天,薪资翻倍

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 随着移动互联网的发展&#xff0c;从业人员能力的整体进步&#xff0c;软件测试需要具备的能力要求越来越高…

Databend 开源周报 第 82 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.com 。Whats New探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。Features & Improvements :…

vue源码分析-基础的数据代理检测

简单回顾一下这个系列的前两节&#xff0c;前两节花了大量的篇幅介绍了Vue的选项合并&#xff0c;选项合并是Vue实例初始化的开始&#xff0c;Vue为开发者提供了丰富的选项配置&#xff0c;而每个选项都严格规定了合并的策略。然而这只是初始化中的第一步&#xff0c;这一节我们…

【计算机组成原理 - 第一章】计算机系统概论(完结)

本章参考王道考研相关课程&#xff1a; 【2021版】1.2.1_计算机硬件的基本组成_哔哩哔哩_bilibili 【2021版】1.2.2_认识各个硬件部件_哔哩哔哩_bilibili 【2021版】1.2.3_计算机系统的层次结构_哔哩哔哩_bilibili 【2021版】1.3_计算机的性能指标_哔哩哔哩_bilibili 目录 一、…

绘制带有角度的CAD图形

这个CAD图形用到的命令有CAD直线、CAD圆、CAD圆弧、CAD偏移和CAD旋转等多个CAD命令相结合才绘制出来。 目标对象 操作步骤 1.先使用直线命令画相交于A点的两条线段&#xff0c;然后A点为圆心画半径12和半径15的圆 2.然后以B点为圆心画半径2的圆&#xff0c;使用复制命令指定圆…

Maven的基本使用

1.Maven的基本介绍2.Maven中仓库的概念3.Maven中坐标的概念坐标示例如下&#xff1a;<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope>//这个是范围 &l…

elasticsearch 8 修改分词器并数据迁移

1. 安装中文索引 下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases 注意&#xff1a;版本要和ES版本对应 解压后放入plugins文件中 然后重启服务&#xff1a;docker-compose restart elasticsearch&#xff0c;大概需要1分钟 2. 数据迁移…

【Spark分布式内存计算框架——Spark Streaming】9. 获取偏移量 应用案例:百度搜索风云榜(上)

4.4 获取偏移量 当SparkStreaming集成Kafka时&#xff0c;无论是Old Consumer API中Direct方式还是New Consumer API方式获取的数据&#xff0c;每批次的数据封装在KafkaRDD中&#xff0c;其中包含每条数据的元数据信息。 文档&#xff1a;http://spark.apache.org/docs/2.4.…

重磅:Meta未来4年路线图曝光,Quest出货超2000万台

The Verge今天曝光了一份Meta内部AR/VR产品规划图&#xff0c;这份规划图为Meta高管为Reality Labs员工的内部分享&#xff0c;包括了大量AR/VR产品信息&#xff0c;下面我们一起来看看。一&#xff0c;未来四年规划Meta Reality Labs四年规划&#xff1a;1&#xff0c;2023年&…

你知道吗?火狐搜集您的数据?

导读请注意,打包在 Firefox Web 浏览器里面的地理位置服务即使浏览器关闭后也会在后台运行。我们还没有从关于浏览器插件丑闻的消息中平复下来。插件原本目的是保卫隐私&#xff0c;但现在却把信息卖给了第三方公司。然而更令人愤怒的是其规模完全超出我们的预计。MLS MLS&…

报错“FirewallD is not running”怎么办,如何解决?

目录 一、报错详情 二、解决方法—开启防火墙步骤 步骤一&#xff1a;先通过命令查看一下防火墙的状态。 步骤二&#xff1a;开启防火墙。 步骤三&#xff1a;再次查看防火墙状态 一、报错详情 在docker创建redis容器&#xff0c;在进行window访问redis容器端口进行绑定设…