问题 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);
}