扫雷自动机求优化
  • 板块灌水区
  • 楼主binomial
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/19 19:10
  • 上次更新2024/8/19 21:12:29
查看原帖
扫雷自动机求优化
894358
binomial楼主2024/8/19 19:10

RT.求优化精度(尽可能不要提高时间复杂度)

//第一行n,后面若干行表示地图(列数不限) 
//x表示雷 .表示空地,0~9表示数字
//由于算法特殊,所以准确性不高,建议使用@yangbaich的算法 
#include <bits/stdc++.h>
using namespace std;
char s[105][105];
double gl[105][105];
int n,flag[105][105];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		cin>>s[i];
	}
	for(int i=1;i<=n;i++){
		int len=strlen(s[i]);
		for(int j=0;j<len;j++){
			gl[i][j]=1;
		}
	}
	for(int i=1;i<=n;i++){
		int len=strlen(s[i]);
		for(int j=0;j<len;j++){
			if(s[i][j]>='0'&&s[i][j]<='9'){
				int num=s[i][j]-'0',kd=0;
				for(int k=-1;k<=1;k++){
					for(int l=-1;l<=1;l++){
						if(i+k<0||j+l<0||i+k>n||j+l>=len){
							continue;
						}
						if(s[i+k][j+l]=='x'){
							num--;
						}
						if(s[i+k][j+l]=='.'){
							kd++;
						}
					}
				}
				for(int k=-1;k<=1;k++){
					for(int l=-1;l<=1;l++){
						if(i+k<0||j+l<0||i+k>n||j+l>=len){
							continue;
						}
						if(s[i+k][j+l]=='.'){
							gl[i+k][j+l]*=1-(1.0*num/kd);
						} 
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		int len=strlen(s[i]);
		for(int j=0;j<len;j++){
			if(s[i][j]>='0'&&s[i][j]<='9'){
				for(int k=-1;k<=1;k++){
					for(int l=-1;l<=1;l++){
						if(i+k<0||j+l<0||i+k>n||j+l>=len){
							continue;
						}
						if(s[i+k][j+l]=='.'&&!flag[i+k][j+l]){
							cout<<"no mine probability:"<<i+k<<" "<<j+l+1<<" "<<gl[i+k][j+l]<<endl;
							flag[i+k][j+l]=1; 
						} 
					}
				}
			}
		}
	}
	return 0;
}
2024/8/19 19:10
加载中...