[2022.1.13]UPC-2021级新生个人训练赛第22场-9782 Problem G 填字游戏

问题 G: 填字游戏

时间限制: 1.000 Sec 内存限制: 128 M

题目描述

六一儿童节就要到了,晨晨的学校进行游园活动,其中一个游戏为填字游戏,规则为:有一个R行C列的棋盘(2≤R,C≤25),棋盘上的每一个格子要么是空的,可以填一个十进制数字;要么是堵上的,以字符“#” 表示(即不能填东西)。棋盘中从左往右连续的数字排列可视为一个十进制整数。
现在给你一个已填好的棋盘,请你帮忙找出棋盘里面最小的整数。

输入

第一行:包括两个数,R和C(2≤R,C≤25),表示R行C列。
接着R行中每行包括C个字符,这些字符要么是数字,要么是“#”。输入数据保证存在解,不存在前导0的情况(例如:01,002)。

输出

棋盘中最小的整数。

样例输入

3 6
3#5789
897#51
163#31

样例输出 Copy

3

提示

对于60%的数据,2≤R,C≤5;
对于80%的数据,2≤R,C≤18;
对于100%的数据,2≤R,C≤25;

题目并不算很难,实现也很简单,;)

但就是有好多点需要注意一下。

比如..连续的####会使我的代码初代目WA

其次,就是可能会出现的25位的超长整数,它成功的击败了我的二代目三代目蒟蒻代码。

让我们来看看四代目代码吧?

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MX 1e9
#define MN -1e9
typedef long long int ll;
using namespace std;
struct NUM{                        //用结构体NUM中的数组来储存整数。
    char dit[30];
}num[11000];
bool cmp(NUM &a,NUM &b){                   //因为我太懒了,想用sort函数,所以写了个比较函数。
    if(strlen(a.dit)!=strlen(b.dit))
    return strlen(a.dit)< strlen(b.dit);
    else
        return strcmp(a.dit,b.dit)<0;
};
int main(){
    char t;
    ll r,c,i,j,lens,cnt=0;
    scanf("%lld %lld",&r,&c);
    for(i=1;i<=r;i++){
        lens=0;
        for(j=1;j<=c;j++){ 
            scanf(" %c",&t);    //scanf中格式控制符%c前加空格可以忽略回车等空白符。
            if(t=='#'){         //我在这里错了好多好多。 
                if(lens){       //接下来应该没什么好说的啦。
                    cnt++;
                    lens=0;
                }
            }
            else{
                num[cnt].dit[lens++]=t;
                num[cnt].dit[lens]='\0';
            }
        }
        if(lens)            
            cnt++;
    }
    sort(num,num+cnt,cmp);
    printf("%s",num[0].dit);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值