csu oj 1395: Timebomb(读取用*组成的数字)

来源:互联网 发布:prada高仿包淘宝 编辑:程序博客网 时间:2024/06/03 03:37
 

题目:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1395


题意很好理解  就是读取用*组成的数字  如果这个数字是存在的  且mod6==0  则输出“BEER!!” mod6!=0输出“BOOM!!”   数字不存在 输出"BOOM!!"


主要的就是读取数字啦~~~~

初始化一个数组  存储0-9   十个数字   该位置出现*  则标记为1  否则 标记为0  组成一个二进制数 也可以表示成16进制数


后来还WA了三次!!!

(1)while(gets(a[0]!=NULL)  之后从i=1开始读取赋值

(2)当以二进制读取1产生一个s值之后 要将s值与num[]中的每个值进行比较,相对应的i取出来产生一个十进制k值 就是*所组成的数字  


代码:

#include <iostream>

#include <cstdio>

#include <cstring>


using namespace std;

int num[10]={0x7B6F,0x1249,0x73E7,0x73CF,0x5BC9,0x79CF,0x79EF,0x7249,0x7BEF,0x7BCF};

const int N=45;

char a[5][N];

int b[5][N];//将出现*处的值标为1

bool flag;

int len;


void init()

{

    int s;

    flag=1;

    int k=0;

    for(int m=0;m<len;m+=4)

    {

        s=0;


        for(int i=0;i<15;i++)

        {

            int j=i/3;

            int k=i%3;

            if(b[j][k+m])

                s=s*2+1;

            else

                s*=2;

        }

//cout<<s<<endl;

        for(int i=0;i<10;i++)

        {

            if(s==num[i])

            {

                k=k*10+i;

                flag=0;

                break;

            }

        }

        if(flag)   break;

    }

//cout<<k<<endl;


    if(!flag)

    {

        if(k%6)

            cout<<"BOOM!!"<<endl;

        else

            cout<<"BEER!!"<<endl;

    }

    else

        cout<<"BOOM!!"<<endl;

}


int main()

{

freopen("F.txt","r",stdin);

//for(int i=0;i<10;i++)

//    cout<<num[i]<<endl;

    while(gets(a[0])!=NULL)

    {

        for(int i=1;i<5;i++)

            gets(a[i]);

        len=strlen(a[0]);

        memset(b,0,sizeof(b));

        for(int i=0;i<5;i++)

            for(int j=0;j<len;j++)

                if(a[i][j]=='*')

                {

                    b[i][j]=1;

//cout<<i<<" "<<j<<endl;

                }

        init();

    }

    return 0;

}


//代码总是有别人的影子  要努力啊!!!!

0 0