EOJ 2015. 自修室

/ 没什么新奇的,但是很久以前写的,用的C,没有oop,希望以后回来更新oop版本 /

题目

单点时限: 2.0 sec

内存限制: 256 MB

一直不去自修室的 Rocker 最近迫于学习压力决定每天都要去自修,鉴于自修室多多,何必与人争挤,所以 Rocker 要坐在左右一个座位都没人,如果不是第一排,那么他的前面一个座位也没有人的位置上,当然 Rocker 也可以坐在墙边但前面或左边或右边有座位的话要没有人才可以。

Rocker 眼力异常好,只要在门口瞟一眼就可以知道哪个位置上有人哪个没有人,但 Rocker 大脑毕竟不像电脑可以迅速计算出这间教室有没有符合他要求的位置,所以请你写一个程序帮助他。

输入格式
输入有多个 case,每个 case 第一行有一个数 n 表示自修室的总间数,接下来描述 n(n⩽100) 个自修室的座位情况,接下来按照 Rocker 对于每间自修室,第一行有四个整数 ID,Dis,R,C(Dis⩽2000000,5⩽R,C⩽15),分别是教室的门号,教室距离 Rocker 寝室的距离,座位的行数以及列数。接下来是一个 R∗C 的 0-1 矩阵,0 表示该座位没有人,1 表示有人。(每间教室 ID,Dis 互异),Rocker 按照距离远近依次找教室自修,去距离寝室最近的一间满足他条件的教室自修。

输出格式
每个 case 输出一行,如果 Rocker 可以自修的教室 ID,若无教室符合条件,输出 “Bad Luck,Rocker!”

样例

input
2
4110 16 15 15
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
4102 15 14 15
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111101111111
111111000011111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
111111111111111
output
4102

思路

思路很清晰了,做一个 Room 的结构体,包含ID,Dis,和Flag(即是否符合)三个成员。
然后按字符串逐行读入每个自习室。为了避免两边和第一排的讨论,我们首先就审清一个最大的20*20的二维数组,并且将其初始化为‘0’,确保边界都是空状态。
然后只要按照题目要求来遍历,搜索到目标空位就把flag设置为1(可坐)。
所有的自习室都输入完之后按照距离远近排序,最后将距离最近的,flag为1的自习室ID输出即可,若不存在就输出对应字符串。

ac代码

#include <stdio.h>
#include <stdlib.h>

struct Room
{
    long long int id,dis,flag;

};

int cmp(const void *a,const void *b)
{
    struct Room x,y;
    x=*((struct Room *)a);
    y=*((struct Room *)b);
    if(x.dis-y.dis<0) return -1;
    return 1;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i,j,k;
        struct Room a[101];
        for(i=0;i<n;i++)
        {
            int line,row;
            char seat[20][20];
            scanf("%lld %lld %d %d",&a[i].id,&a[i].dis,&row,&line);
            for(j=0;j<20;j++) //清空座位
            {
                for(k=0;k<20;k++)
                {
                    seat[j][k]='0';
                }
            }

            for(j=1,getchar();j<row+1;j++) //记录人
            {
                for(k=1;k<line+1;k++)
                {
                    scanf("%c",&seat[j][k]);
                }
                getchar();
            }

            for(a[i].flag=0,j=1;j<row+1;j++) //判断是否有座位
            {
                for(k=1;k<line+1;k++)
                {
                    if(seat[j][k]=='0'&&seat[j-1][k]=='0'
                    &&seat[j][k+1]=='0'&&seat[j][k-1]=='0')
                    {
                        a[i].flag=1;
                        break;
                    }
                }
                if(a[i].flag==1)
                    break;
            }
        }
        qsort(a,n,sizeof(a[0]),cmp);
        int cnt=0;
        for(i=0;i<n;i++)
        {
            if(a[i].flag==1)
            {
                printf("%lld\n",a[i].id);
                cnt=1;
                break;
            }
        }
        if(cnt==0)
            printf("Bad Luck,Rocker!\n");
    }
    return 0;
}

原创文章 9 获赞 10 访问量 659

猜你喜欢

转载自blog.csdn.net/qq_45401156/article/details/105870339
今日推荐