[扫雷][游戏] 交互*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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值