[扫雷][游戏] 交互*2
由于是校内训练赛 就不贴网址啦【贴了你也进不去2333
扫雷是T1嘛 反正就很水
先随机找几个点然后 枚举随机种子S是啥就可以了
然后这道题开启了机房疯狂hack的节奏QAQ
交互的本地测试可以直接把代码贴到grader后面就可以啦/xyx
#include "mine.h"
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<ctime>
#define inf 12251225
#define ll long long
#define mxn 40
using namespace std;
int vis[mxn][mxn],f[mxn][mxn]; // 9 unvisited
bool ban[mxn][mxn];
int xx[8] = {-1,-1,-1,0,0,1,1,1};
int yy[8] = {1,0,-1,1,-1,1,0,-1};
void sweep(int W, int H, int K)
{
int times = 0;
srand(time(0));
for(int i=0;i<W;i++) for(int j=0;j<H;j++)
vis[i][j] = 9;
while(times<6)
{
int x = rand()%W,y = rand()%H;
if(vis[x][y]!=9) continue;
int opt = open(x,y); vis[x][y] = opt;
if(opt == -1) times++;
}
for(int S = 100;S <= 10000;S++)
{
int cnt = 0,tmp = S;
memset(ban,0,sizeof(ban));
while(cnt < K)
{
tmp = (ll)48271 * tmp % 2147483647;
int r = (tmp/H)%W, c = tmp%H;
if(!ban[r][c])
{
ban[r][c] = 1;
cnt++;
}
}
int www = 0;
for(int x=0;x<W&&!www;x++)
for(int y=0,qaq=0;y<H;y++,qaq=0)
{
if(!ban[x][y])
for(int i=0;i<8;i++)
{
int tx = x+xx[i],ty = y+yy[i];
if(tx<0||ty<0||tx>=W||ty>=H||!ban[tx][ty]) continue;
qaq++;
}
else qaq=-1;
if(vis[x][y]!=9&&vis[x][y]!=qaq){www=1;break;}
}
if(!www) break;
}
for(int x=0;x<W;x++) for(int y=0;y<H;y++)
{
if(vis[x][y]!=9||ban[x][y]) continue;
open(x,y);
}
}
游戏有点神仙
就是我们通过比较前后两次的差来确定哪个是正确的
然后记录一个前缀和就可以减少后半部分的查询次数
然后通过多发爆oj以及按照得分更改查询次数【大雾 就可以阿掉这道题啦
#include<cstdio>
#include "guess.h"
#include<algorithm>
#include<cmath>
#define N 1000
using namespace std;
std::string ans;
int vis[1100][1100];
int qry(int l,int r)
{
if(~vis[l][r]) return vis[l][r];
return vis[l][r] = query(l,r);
}
int f[2],pre[1100];
std::string guess()
{
memset(vis,-1,sizeof(vis));
ans = '';
for(int i=0;i<=50;i++)
{
f[0] = f[1] = 0;
int r = N-1;
while(abs(f[0] - f[1]) < 3)
{
int now = qry(i,r), nxt = qry(i+1,r);
if(nxt <= now && now-nxt <=1)
f[now-nxt] ++;
r--;
}
ans += (f[0]>f[1]?'0':'1');
pre[i+1] = pre[i] + f[1]>f[0];
}
for(int i=51;i<N;i++)
{
f[0] = f[1] = 0;
int l = 0;
while(abs(f[0] - f[1]) < 3)
{
int now = qry(l,i), del = now - (pre[i] - pre[l]);
if(del == 0 || del == 1) f[del]++;
l++;
}
ans+=(f[0]>f[1]?'0':'1');
pre[i+1] = pre[i] + f[1]>f[0];
}
return ans;
}
mmp为什么没有高亮QAQ