2018 ICPC Asia Jakarta Regional Contest Gym - 102001D. Icy Land

//#if 0
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
#include <set>
#include <list>
#include <iostream>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))
#define INF  0x3f3f3f3f
const int maxn=2e4+50;

int r,c;
char maz[505][505];

int cal()
{
    int ans=0,flag=0;
    for(int i=0;i<r;i++){
        for(int j=0;j<c;j++){
            if(i==0 || i==r-1 || j==0 || j==c-1){
                if(i==0 && j==0)continue;
                if(i==0 && j==c-1)continue;
                if(i==r-1 && j==0)continue;
                if(i==r-1 && j==c-1)continue;
                if(maz[i][j]=='#')flag=1;
            }
            else{
                if(maz[i][j]=='.')ans++;
            }
        }
    }
    if(flag==0)ans++;
    return ans;
}


int main()
{
//    freopen("in1.txt","r",stdin);
    scanf("%d%d",&r,&c);
    for(int i=0;i<r;i++){
        scanf("%s",maz[i]);
    }
    int ans=0;
    if(r==1){
        for(int i=1;i<c-1;i++){
            if(maz[0][i]=='.')ans++;
        }
    }
    else if(c==1){
        for(int i=1;i<r-1;i++){
            if(maz[i][0]=='.')ans++;
        }
    }
    else if(r==2){
        for(int i=1;i<c-1;i++){
            if(maz[0][i]=='.' && maz[1][i]=='.')ans++;
        }
    }
    else if(c==2){
        for(int i=1;i<r-1;i++){
            if(maz[i][0]=='.' && maz[i][1]=='.')ans++;
        }
    }
    else{
        ans=cal();
    }
    cout<<ans<<endl;
    return 0;
}
//#endif

题意:给你一个矩阵,里面有.和#两种符号,井号代表土地可以站在上面,点代表冰地,会滑走,比如从1.1走到1.3,中间1.2是冰,1.1和1.3都是土地,那么你就会直接从1.1滑到1.3,已经站立过的位置只有1.1和1.3,1.2算滑过的不算站立过,就像口袋妖怪地图里面的冰地板滑来滑去那样。

问:假如你可以随意把冰地板变成土地,那么要求你选择最少的冰地板把他们变成土地,从而使得矩阵中,在任意一个点开始行走,都可以把矩阵里所有点都站立一遍。

思路:大矩阵内侧 2到n-1 与 2到m-1 组成的一个矩形中不能有冰地板,若有,则一定到达不了,而外围宽度只有1的一圈,除四角外还必须有一个土地保证可以进入内矩阵,特殊情况是两行两列和一行一列的时候,一行一列只要首尾是冰其他都是土地就行了,两行两列的时候要保证4角都是冰,而内里的两条矩阵保证不能有同一行(当行=2时是同一列)都是冰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值