zoukankan      html  css  js  c++  java
  • 【题解】射击-C++

    出处:https://blog.csdn.net/qq_41654438/article/details/81449630

    Description
    不难发现,豆豆能从很多事情中去思考数学,于是豆豆父母决定让他去练习射击,这是项需要集中注意力的运动,相信
    能够让豆豆暂时脱离数学。学习射击的第一天就让豆豆产生 了浓厚的兴趣,射击的靶子是大饼圆,射击枪的子弹近
    似圆柱,为什么要圆的不能是其他的 形状呢,于是豆豆开始构思,设计了这样一个好玩的问题:N*M 的方形格子靶子,
    每个格子有两种状态凸或者凹(如下图浅色表示凹,深色表示凸)

    现在用一个十字横截面的子弹(填充黑色部分)去射击,被射中的小格子凹变凸,凸变 凹,子弹放大后的横截面如下图

    这种子弹最多可以覆盖 5 个格子,如图打完后,5 个格子凹凸状态发生了变化

    请问最少需要几次射击使靶子中所有小格子都呈现凹的状态。
    注意:子弹中心点如果打到四个角上则只会影响 3 个格子,如下图黑色格子表示被子 弹中心点正好击中左上角后覆
    盖的 3 个格子,如果打到除四个角的边界上,则会影响到 4 个格子,如下图右侧的 4 个黑色格子所示,这是子弹中
    心点打中第 3 行第 6 列时的覆盖情 况。(也就是说子弹超出靶子部分不起效)

    Input
    第一行两个用空格隔开的数字 N 和 M(1<=N,M<=17)
    接下来 N 行 述靶子中小格子的状态,‘X’表示凸,‘.’表示凹。

    Output
    输出所需要的最少射击次数
    注意:输入数据保证有解

    Sample Input
    【样例输入 1】
    5 5
    XX.XX
    X.X.X
    .XXX.
    X.X.X
    XX.XX

    【样例输入 2】
    8 9
    ..XXXXX..
    .X…..X.
    X..X.X..X
    X…….X
    X.X…X.X
    X..XXX..X
    .X…..X.
    ..XXXXX..
    Sample Output
    【样例输出 1】
    5

    【样例输出 2】
    25

    #include <bits/stdc++.h>
    using namespace std;
    char st[29][29];
    int n,m,ans,sum;
    int a[29],b[29][29],map1[29][29];
    void  ds(int x,int y)
    {
    
        b[x][y]=!b[x][y];
        b[x-1][y]=!b[x-1][y];
        b[x+1][y]=!b[x+1][y];
        b[x][y-1]=!b[x][y-1];
        b[x][y+1]=!b[x][y+1];
        sum++;
    }
    void dfs(int dep)
    {
    
        int f;
        if(dep>m)
       {
    
         sum=0;
         for(int i=1;i<=n;i++)
         for(int j=1;j<=m;j++)
         b[i][j]=map1[i][j];
         for(int i=1;i<=m;i++)
         if(a[i]==1)  ds(1,i);
         for(int i=2;i<=n;i++)
         for(int j=1;j<=m;j++)
         if(b[i-1][j]==1)   ds(i,j);
         f=1;
         for(int i=1;i<=m;i++)
         if(b[n][i]==1)  f=0;  
    
         if(f&&sum<ans)  ans=sum;
             return ;
         }
        a[dep]=0;
        dfs(dep+1);
        a[dep]=1;
        dfs(dep+1);
    }
    int main()
    {
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>st[i][j];
            if(st[i][j]=='X')  map1[i][j]=1;
            else
            map1[i][j]=0; 
        }
        ans=n*m;
        dfs(1);
        printf("%d",ans);
        return 0;
     } 
    个人博客地址: www.moyujiang.com 或 moyujiang.top
  • 相关阅读:
    右值和move 与 forward
    C++11的chrono库,实现毫秒微秒级定时
    HDOJ 1176 免费馅饼(完全背包)
    HDU 1069 Monkey and Banana
    杭电 1003 Max Sum (动态规划)
    UVA ~ 514 ~ Rails (栈)
    UVA 679
    UVA11988 Broken Keyboard (a.k.a. Beiju Text)【数组模拟链表】
    Codeforces 845 C Two TVs
    codeforces 845A Chess Tourney
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11167743.html
Copyright © 2011-2022 走看看