1 条题解

  • 0

    题意分析

    题目要求模拟BINGOBINGO游戏的过程,给定一张卡片和一系列数字,判断玩家何时会赢得游戏(即卡片上出现55个标记的行、列或对角线)。需要处理卡片数据的读取、数字的匹配以及胜利条件的判断。

    解题思路

    1. 卡片表示:使用二维数组表示卡片,中心格子标记为特殊值(如00)。
    2. 数字匹配:遍历宣布的数字序列,检查是否在卡片上存在,若存在则标记。
    3. 胜利条件检查:每次标记后,检查是否有行、列或对角线被完全标记(包括中心格子)。

    实现步骤

    1. 读取输入:读取游戏数量nn,然后逐个处理每个游戏的卡片和数字序列。
    2. 初始化卡片:将卡片数据存储在二维数组中,中心格子特殊处理。
    3. 模拟游戏过程
      • 遍历数字序列,标记卡片上的对应数字。
      • 每次标记后检查是否满足胜利条件。
    4. 输出结果:当满足胜利条件时,输出当前宣布的数字数量。

    代码实现

      #include<stdio.h>
      #include<string.h>
      #include<stdlib.h>
      #include<algorithm>
      using namespace std;
      const int maxn = 8;
      int mat[ maxn ][ maxn ];
      bool vis[ maxn ][ maxn ];
      bool appear[ 85 ];
      struct node{
         int x,y;
     }num[ 105 ];
     
     void init(){
         memset( appear,false,sizeof( appear ) );
         memset( vis,false,sizeof( vis ) );
         vis[3][3] = true;
     }
     
     
     bool judge(){
         int cnt;
         for( int i=1;i<=5;i++ ){
             cnt = 0;
             for( int j=1;j<=5;j++ ){
                 if( vis[i][j]==true )
                     cnt++;
                 else
                     break;
             }
             if( cnt==5 ) return true;//row
             cnt = 0;
             for( int j=1;j<=5;j++ ){
                 if( vis[j][i]==true )
                     cnt++;
                 else
                     break;
             }
             if( cnt==5 ) return true;//col
         }
         cnt = 0;
         for( int i=1;i<=5;i++ )
             if( vis[i][i]==true )
                 cnt++;
            else
                 break;
         if( cnt==5 ) return true;//dia
         if( vis[1][5]==true&&vis[2][4]==true&&vis[4][2]==true&&vis[5][1]==true )
             return true;
         return false;
     }
     
     int main(){
         int n;
         scanf("%d",&n);
         while( n-- ){
             init();
             for( int i=1;i<=5;i++ ){
                 if( i!=3 ){
                     for( int j=1;j<=5;j++ ){
                         scanf("%d",&mat[i][j]);
                         num[ mat[i][j] ].x = i;
                         num[ mat[i][j] ].y = j;
                         appear[ mat[i][j] ] = true;
                     }
                 }
                 else{
                     for( int j=1;j<=2;j++ ){
                         scanf("%d",&mat[i][j]);
                         num[ mat[i][j] ].x = i;
                         num[ mat[i][j] ].y = j;
                         appear[ mat[i][j] ] = true;
                     }
                     for( int j=4;j<=5;j++ ){
                         scanf("%d",&mat[i][j]);
                         num[ mat[i][j] ].x = i;
                         num[ mat[i][j] ].y = j;
                         appear[ mat[i][j] ] = true;
                     }
                 }
             }
             int ans = 0;
             int in_num;
             bool flag = false;
             //printf("input\n");
             for( int i=1;i<=75;i++ ){
                 scanf("%d",&in_num);
                 if( flag==false ) ans++;
                 if( appear[ in_num ]==true ){
                     vis[ num[ in_num ].x ][ num[ in_num ].y ] = true;
                     if( judge()==true ){
                         flag=true;
                     }
                 }
             }
             printf("BINGO after %d numbers announced\n",ans);
         }
         return 0;
     }
    • 1

    信息

    ID
    1303
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者