• 2015苏州大学ACM-ICPC集训队选拔赛(2)1002


    草爷要的雷

    Problem Description

    扫雷一直是风靡实验室的重要娱乐游戏,在赛前赛后、刷题疲惫的时候,扫一局雷经常可以让队员们感受到身心的振奋,毕竟,劳逸结合刷题,防猝死才是硬道理。
    但是我的运气总是太差,关键时刻二选一总是会点到雷,果然扫雷也是看脸的游戏。被炸得神志不清的时候,我已经完全没有办法区分哪些格子是雷了,只能随机点格子了,所以请你们帮我算一下我点下去被雷炸的概率,谢啦~
    当然,在给出的扫雷图中,我点开了一个数字格以及它周围的若干格(周围是指与那一个格子共享一条边或一个顶点的格子,周围的格子没有被全部点开),并且我接下来一步只会点这个数字周围没有点开的格子;


    扫雷部分规则:
    每个格子点开只可能是数字、空格子、雷。
    标有数字的格子上,数字表示它周围的格子中一共有的雷总数。

    Input

    多组输入(<=1000),请读到文件结尾;
    每组数据第一行是两个整数n和m(2<=n,m<=10),表示扫雷图的行数和列数;
    接下来n行,每行m个字符表示这个扫雷图的每一行。
    图中'*'表示没有点开的格子,'.'表示数字周围且已经点开的格子(代表数字或空格子),以及一个数字(1~8)。
    保证数字只有一个,它周围剩余的没有点开的格子数大于等于数字的值(即保证输入扫雷图的合法),'.'只出现在数字周围。

    Output

    对于每组数据输出一个最简分数,表示下一步点开数字格子周围的某个还未被点开的格子时,该格子是雷的概率(若概率为1,输出1/1)。
    每组数据占一行

    Sample Input

    3 3
    **.
    .3.
    ***
    4 5
    *****
    ***.*
    **.2.
    **...
    

    Sample Output

    3/5
    1/1
    

    Author

    奚政
    还是一道比较水的题目,我这里是用一个二维数组做一个棋盘,二维字符做棋子,这样清空数组就简单一点
    #include<stdio.h>
    //#include<bits/stdc++.h>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    #include<sstream>
    #include<set>
    #include<queue>
    #include<map>
    #include<vector>
    #include<algorithm>
    #include<limits.h>
    #define inf 0x3fffffff
    #define INF 0x3f3f3f3f
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define ULL unsigned long long
    using namespace std;
    char s[100][100];
    int a[100][100];
    int i,j;
    int n,m;
    int main ()
    {
        int x,y;
        int I,J;
        while(cin>>n>>m)
        {
            memset(a,0,sizeof(a));
            int sum=0;
            int ans;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                   cin>>s[i][j];
                   if(s[i][j]=='*')
                   {
                       a[i][j]=1;
                   }
                   if(s[i][j]=='.')
                   {
                       a[i][j]=2;
                   }
                   else if(s[i][j]>='1'&&s[i][j]<='8')
                   {
                       a[i][j]=3;
                       ans=s[i][j]-'0';
                       x=i;
                       y=j;
                   }
                }
            }
            for(I=x-1;I<=x+1;I++)
            {
                for(J=y-1;J<=y+1;J++)
                {
                    if(a[I][J]==1)
                    {
                        sum++;
                    }
               //     cout<<a[I][J];
                }
              //  cout<<endl;
            }
         //   cout<<sum<<endl;
            cout<<ans/__gcd(sum,ans)<<"/"<<sum/__gcd(sum,ans)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    java常见异常
    实现两个整数变量交换
    java抽象类与接口
    Java内部类用法
    单例模式
    easyUI下拉列表点击事件的使用
    Java中使用HttpRequest获取用户真实IP地址端口
    js-easyUI格式化时间
    1124
    ACM算法
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/5136547.html
Copyright © 2020-2023  润新知