表面上看是一道交互题,但是实际上可以把所有数据存下来
比较看一下它的种子是哪一个就可以了,找的办法非常简单
#include <bits/stdc++.h>
#include "minesweeper.h"
using namespace std;
static const int dx[] = {1, 1, 0, -1, -1, -1, 0, 1};
static const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
int g[60][60];
int vis[60][60];
int ooo[60][60];
void sweep(int w,int h,int k)
{
for(int tot=5,i=0;i<w&&tot;i++)
{
for(int j=0;j<h&&tot;j++)
{
vis[i][j]=open(i,j);
ooo[i][j]=1;
if(vis[i][j]==-1)tot--;
}
}
for(int s=100;s<=10000;s++)
{
int t=s;
int r,c;
for(int i=0;i<w;i++){
for(int j=0;j<h;j++)
{
g[i][j]=0;
}
}
for(int j=1,u=k;u;j++)
{
t=1ll*t*48271%2147483647;
r=(t/h)%w;
c=t%h;
if(g[r][c]==-1)continue;
u--;
g[r][c]=-1;
}
int fl=0;
for(int i=0;i<w;i++)
{
for(int j=0;j<h;j++)
{
int tot=0;
if(g[i][j]==-1)continue;
for(int k=0;k<8;k++)
{
int xx=i+dx[k],yy=j+dy[k];
if(xx<0||yy<0||xx>=w||yy>=h)continue;
if(g[xx][yy]==-1)tot++;
}
g[i][j]=tot;
}
}
for(int i=0;i<w;i++)
{
for(int j=0;j<h;j++)
{
if(ooo[i][j]){
if(vis[i][j]!=g[i][j]){
fl=1;break;
}
}
}
}
if(!fl){
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
if(ooo[i][j]==0&&g[i][j]!=-1) open(i,j);
}
}
}
}
return ;
}