草爷要的雷
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; }
时间: 2024-10-15 05:39:37