http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5746

题目大意:

N*M的方格里,每个格子有一个指针,一开始指向上下左右四个方向中的一个,选一个格子点一次,那个格子的指针会顺时针转一下,接着被它指着的那个格子的针也会顺时针转一下,一直连锁下去。  构造一种不超过6000次点击的方案,使得所有针朝上。

题解:
$need[x][y]$表示这个格子的针转多少次可以朝上。

$A[x][y]$表示这个格子主动转了多少次。

$B[x][y]$表示这个格子由于受到边上格子的影响被动转了多少次。

那么有:

$A[x][y] + B[x][y] = 4 * K[x][y] + need[x][y]$. (等式1)

$B[x][y] = \sum (K[x'][y'] + [(x', y')转到朝上的过程中会影响到(x, y)]) $  (等式2)

其中$(x', y')是和(x, y)相邻的格子$

一开始先假设所有的 $K[x][y] = 0$,那么所有的$A[x][y]$ $B[x][y]$ 都可以计算出来。但是某些$A[x][y]$会是负数。

考虑把一些$K[x][y]$加大。 如果把$K[x][y] += 1$, 为了使得之前的等式仍然成立,必须有$A[x][y] += 4$,所有和它相邻的格子(x', y')必须 $A[x'][y'] -= 1, B[x'][y'] += 1$。

然后先本地开始乱shi:

因为不超过6000步,平均每个格子60步。

所以从上到下从左到右,如果发现当前格子的$A[x][y] <= 56$, 就不断让当前格子+4,和它相邻格子-1。

这样做一次后,发现最外面的一圈的$A[x][y]$都是几十了。中间的还是会有一些负数。

重复上面的过程,发现每做一次都会使得A为几十的圈子往里缩小。重复10次就ok了。

思考:为什么所有让$A[x][y]>=0$ 就好了呢?

因为一组合法的$A[x][y]$,可以解出所有的$B[x][y]$ 和 $K[x][y]$.且解是唯一的。

证明: 把等式1中的B用K表示带入等式二,得到$N^2$个关于$K$的方程,$K$有$N^2$个变量,所以如果有解,解一定唯一。

 #include <bits/stdc++.h>
using namespace std; #define MAXN 15 int n, m;
int a[MAXN][MAXN], x[MAXN][MAXN], y[MAXN][MAXN];
int dx[] = {-, , , };
int dy[] = {, , , -};
int ok[][], need[MAXN][MAXN]; bool check(int x, int y)
{
return x >= && x <= n && y <= m && y >= && a[x][y] != -;
} int main()
{
//freopen("in.txt", "r", stdin);
ok[][] = ;
ok[][] = ok[][] = ;
ok[][] = ok[][] = ok[][] = ; int T;
scanf("%d", &T);
while (T--)
{
scanf("%d %d", &n, &m);
for (int i = ; i <= n; ++i)
{
for (int j = ; j <= m; ++j)
{
scanf("%d", &a[i][j]);
if (a[i][j] == -) continue;
a[i][j] = ( - a[i][j]) % ;
need[i][j] = ( - a[i][j]) % ;
}
}
memset(x, , sizeof(x));
memset(y, , sizeof(y));
int _i, _j;
for (int i = ; i <= n; ++i)
{
for (int j = ; j <= m; ++j)
{
if (a[i][j] == -) continue;
for (int d = ; d < ; ++d)
{
_i = i + dx[d], _j = j + dy[d];
if (check(_i, _j) && ok[d][a[_i][_j]])
++y[i][j];
}
x[i][j] = need[i][j] - y[i][j];
}
}
int iters = ;
while (iters--)
{
for (int i = ; i <= n; ++i)
{
for (int j = ; j <= m; ++j)
{
if (a[i][j] == -) continue;
while (x[i][j] + <= )
{
x[i][j] += ;
for (int d = ; d < ; ++d)
{
_i = i + dx[d], _j = j + dy[d];
if (check(_i, _j)) --x[_i][_j], ++y[_i][_j];
}
}
}
}
}
vector<pair<int, int> > ans;
for (int i = ; i <= n; ++i)
{
for (int j = ; j <= m; ++j)
{
if (a[i][j] == -) continue;
assert(x[i][j] >= );
while (x[i][j] > ) --x[i][j], ans.push_back(make_pair(i, j));
}
}
printf("%d\n", ans.size());
for (int i = ; i < (int)ans.size(); ++i)
printf("%d %d\n", ans[i].first, ans[i].second);
} return ;
}

Crosses Puzzles zoj 4018 (zju校赛)的更多相关文章

  1. ZOJ 17届校赛 Knuth-Morris-Pratt Algorithm( 水题)

    In computer science, the Knuth-Morris-Pratt string searching algorithm (or KMP algorithm) searches f ...

  2. ZOJ 17届校赛 How Many Nines

    If we represent a date in the format YYYY-MM-DD (for example, 2017-04-09), do you know how many 9s w ...

  3. ZOJ 3955 Saddle Point 校赛 一道计数题

    ZOJ3955 题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于 ...

  4. ZJU 17th 校赛

    第一次参加校赛,和小伙伴们拿了7个气球,还是挺开心的.  简单记个流水账吧. A:判断出INF的情况后 暴力模拟即可. INF的情况有x=1 || y=1 || (x==2 && y= ...

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. SCNU省选校赛第二场B题题解

    今晚的校赛又告一段落啦,终于"开斋"了! AC了两题,还算是满意的,英语还是硬伤. 来看题目吧! B. Array time limit per test 2 seconds me ...

  7. 2014上半年acm总结(1)(入门+校赛)

    大一下学期才开始了acm,不得不说有一点迟,但是acm确实使我的生活充实了很多,,不至于像以前一样经常没事干=  = 上学期的颓废使我的c语言学的渣的一笔..靠考前突击才基本掌握了语法 寒假突然醒悟, ...

  8. 2017CUIT校赛-线上赛

    2017Pwnhub杯-CUIT校赛 这是CUIT第十三届校赛啦,也是我参加的第一次校赛. 在被虐到崩溃的过程中也学到了一些东西. 这次比赛是从5.27早上十点打到5.28晚上十点,共36小时,中间睡 ...

  9. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

随机推荐

  1. 下载论坛源码GBK UTF8 BIG5分别是什么意思

    下载论坛源码GBK UTF8 BIG5分别是什么意思? 提问者:ly1987520 | 浏览次数:4010次 下载论坛源码简体中文GBK 简体中文UTF8 繁体中文BIG5 分别是什么意思?他们的区别 ...

  2. C# 5 in a Nutshell - Delegate

    1. What is delegate in C#? A delegate is an object that knows how to call a method.A delegate type d ...

  3. websphere中的会话超时设置 和 web应用中web.xml中session-timeout关系

    Tomcat默认的会话的超时时间设置 设置Tomcat session有效期的三种方式有: 1.在tomcat/conf/web.xml中修改session-timeout的值,该设置是TOMCAT全 ...

  4. Unity3d 4.3 通过代码动态更改SpriteRender的Sprite

    http://www.unitymanual.com/home.php?mod=space&uid=2452&do=blog&id=420 using UnityEngine; ...

  5. ZK框架笔记5、事件

            事件是org.zkoss.zk.ui.event.Event类,它通知应用程序发生了什么事情.每一种类型的事件都由一个特定的类来表示.         要响应一个事件,应用程序必须为事 ...

  6. Android实战技巧之三十八:Handler使用中可能引发的内存泄漏

    问题描写叙述 曾几何时,我们用原来的办法使用Handler时会有以下一段温馨的提示: This Handler class should be static or leaks might occur ...

  7. JavaMelody、prob系统监控工具使用配置

    分类: 工具 2014-04-23 14:41 1857人阅读 评论(1) 收藏 举报 目录(?)[+] 项 目开发结束了,需要做一下压力测试,就使用apache自带的ab程序进行压力测试,300个并 ...

  8. Ubuntu 如何切换到root账户

    root账号问题 ubuntu默认禁用了root账号,所以当年试图使用su root命令切换到root用户时,尽管你已经输入了正确的密码,终端依旧会提示你密码错误.你需要执行以下命令解除root账号的 ...

  9. kettle--组件(2)--计算器

    组件如下: 对计算类型的说明如下: The table below contains descriptions associated with the calculator step: Functio ...

  10. 用prerender-spa-plugin插件Vue项目优化SEO做ssr服务端渲染及预渲染

    今天在做公交的时候没干,用手机看看文章,偶然发现了一个关于Vue优化seo的文章,我先是在Vue的官方文档看了一篇关于Vue做SEO优化的文章. 上面提到了nuxt.js这个框架,这个框架我做过一个小 ...