模拟战役

模拟战役

https://ac.nowcoder.com/acm/problem/14698

题意:回合制游戏......齐齐先手,每次攻击完司机,然后司机打齐齐攻击司机的那一个物品,但是每次会有连锁反应.......真就是我打别人,然后极限一换一
题解:搜索+贪心
先求对于司机多少次连锁反应可以团灭
再求对于齐齐多少次连锁反应可以团灭
然后比较两个的次数
如果齐齐的次数<司机的次数,输出-1
否则,求齐齐用来极限一换一的连锁的那几个大炮,产生连锁反应,所损失的最小的大炮数,然后总数再减去损失数就是答案
求连锁反应的可以用搜索,对于每次的求的时候要标记,防止重复,就是求每一次的连锁反应可以影响多少个大炮
然后把求的连锁反应所影响的大炮的个数从小到大排序,取前司机团灭数个求和
时间复杂度:图片说明 实际要高于的,但是每次搜索有标记所以还是比较趋近的

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll MOD=1e9+7;
int num,w,numq,nump,qq[10000],pp[10000];
char q[10][110],p[10][110];
bool visq[10][110],visp[10][110];
void dfsp(int x,int y)
{
    if(visp[x][y]) 
        return;
    num++;
    visp[x][y]=1;
    for(int i=-1;i<=1;i++)
    {
        for(int j=-1;j<=1;j++)
        {
            if(i==j&&i==0) 
                continue;
            int nx=x+i,ny=y+j;
            if(nx<=0||ny<=0||nx>4||ny>w) 
                continue;
            if(p[nx][ny]=='*') 
                dfsp(nx,ny);
        }
    }
}
void dfsq(int x,int y)
{
    if(visq[x][y]) 
        return;
    num++;
    visq[x][y]=1;
    for(int i=-1;i<=1;i++)
    {
        for(int j=-1;j<=1;j++)
        {
            if(i==j&&i==0) 
                continue;
            int nx=x+i,ny=y+j;
            if(nx<=0||ny<=0||nx>4||ny>w) 
                continue;
            if(q[nx][ny]=='*') 
                dfsq(nx,ny);
        }
    }
}
int main()
{
    cin>>w;
    for(int i=1;i<=4;i++)
        for(int j=1;j<=w;j++) 
            cin>>p[i][j];
    for(int i=1;i<=4;i++)
        for(int j=1;j<=w;j++) 
            cin>>q[i][j];
    for(int i=1;i<=4;i++)
    {
        for(int j=1;j<=w;j++)
        {
            if(p[i][j]=='*'&&!visp[i][j])
            {
                num=0;
                dfsp(i,j);
                pp[nump++]=num;
            }
        }
    }
    for(int i=1;i<=4;i++)
    {
        for(int j=1;j<=w;j++)
        {
            if(q[i][j]=='*'&&!visq[i][j])
            {
                num=0;
                dfsq(i,j);
                qq[numq++]=num;
            }
        }
    }
    if(nump>numq) 
        printf("-1\n");
    else
    {
        int total=0;
        sort(qq,qq+numq);
        for(int i=0;i<numq;i++) 
            total+=qq[i];
        for(int i=0;i<nump-1;i++) 
            total-=qq[i];
        printf("%d\n",total);
    }
    return 0;
}
全部评论

相关推荐

02-28 01:18
已编辑
南昌大学 后端工程师
黑皮白袜臭脚体育生:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4249次浏览 75人参与
# AI面会问哪些问题? #
27474次浏览 550人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15051次浏览 221人参与
# 你的实习产出是真实的还是包装的? #
20012次浏览 342人参与
# 找AI工作可以去哪些公司? #
8924次浏览 230人参与
# 春招至今,你的战绩如何? #
64347次浏览 575人参与
# 厦门银行科技岗值不值得投 #
7916次浏览 188人参与
# 从事AI岗需要掌握哪些技术栈? #
8776次浏览 299人参与
# 你做过最难的笔试是哪家公司 #
33017次浏览 229人参与
# 中国电信笔试 #
31886次浏览 292人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340689次浏览 2173人参与
# 阿里笔试 #
178341次浏览 1314人参与
# 第一份工作一定要去大厂吗 #
14380次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22046次浏览 280人参与
# 沪漂/北漂你觉得哪个更苦? #
9741次浏览 193人参与
# HR最不可信的一句话是__ #
6145次浏览 113人参与
# 应届生第一份工资要多少合适 #
20663次浏览 86人参与
# AI时代,哪个岗位还有“活路” #
11407次浏览 339人参与
# 春招你拿到offer了吗 #
831056次浏览 9986人参与
# 长得好看会提高面试通过率吗? #
22510次浏览 254人参与
# 聊聊你的职场新体验 #
336426次浏览 1895人参与
# 学历对求职的影响 #
665090次浏览 4249人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务