题目链接:http://codeforces.com/problemset/problem/441/C

题目意思:将n * m 的矩阵分成 k 堆。每堆是由一些坐标点(x, y)组成的。每堆里面至少由 >= 2 个坐标点组成,这些坐标点还需要满足: |xi - xi + 1| + |yi - yi + 1| = 1 。这个等式表示遍历堆里面的坐标好像蛇形那样走,也就是坐标点与坐标点之间需要相邻!还有一个条件就是,每个坐标点只能用一次。

做了一整天= =。改了一个问题,另一个问题又出现了。终于被一个问题攻陷了= =。

整体思路就是 k - 1堆中,每堆由两个坐标组成,剩下的那一堆,由剩下未用的坐标构成。由于我做的时候是一竖竖地做的(假设 3 * 5的矩阵,1 1 1 2 2 1 2 2...),所以有个问题就是剩下的那堆,从第一行开始走的时候,是从左到右走还是从右到左走?我错误的代码中,判断不了对于分完k-1堆之后,箭头是如何走的!我是通过k-1堆之后被覆盖的总行数的奇偶数来判断的:奇数:从左至右,偶数:从右至左。但是对于行数为奇数来说,就不行了。以下这两种情况足以证实。

5  9  20

 (被覆盖的总行数为奇数,但正确走法应该是从右至左)

2   2  1

  (与推测相同)

先贴下我错的代码(读者可直接忽略),一场噩梦= =

(test 24 错了,说堆中有些tube 不符合条件)

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = + ;
int vis[maxn][maxn]; int main()
{
int n, m, k;
while (scanf("%d%d%d", &n, &m, &k) != EOF)
{
memset(vis, , sizeof(vis));
int row = , y = ;
int cnt, tmp, f = , sum = ;
for (cnt = ; cnt <= k-; )
{
if (y+ > m)
break;
printf("2 %d %d %d %d\n", row, y, row, y+);
vis[row][y] = vis[row][y+] = ;
sum += ;
row++;
cnt++;
if (!(row % n) && cnt+ <= k-)
{
printf("2 %d %d %d %d\n", row, y, row, y+);
vis[row][y] = vis[row][y+] = ;
sum += ;
y += ;
row = ;
f = ;
cnt++;
}
}
int col = m;
for (int row = ; row+ <= n && cnt <= k-; row += , cnt++)
{
printf("2 %d %d %d %d\n", row, col, row+, col);
vis[row][col] = vis[row+][col] = ;
sum += ;
}
tmp = (!f ? row- : n);
// printf("tmp = %d\n", tmp);
if ((n*m)-sum)
{
printf("%d ", n*m-sum);
int start = (tmp& ? : ); // 奇数顺着来走
for (int row = ; row <= n; row++)
{
if (start)
{
for (int col = ; col <= m; col++)
{
if (!vis[row][col])
printf("%d %d ", row, col);
}
}
else
{
for (int col = m; col >= ; col--)
{
if (!vis[row][col])
printf("%d %d ", row, col);
}
}
start ^= ;
}
}
printf("\n");
}
return ;
}

AC代码(真是简单就为美啊~~~)

规规矩矩,一行行顺着来做

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; int n, m, k; void next(int &x, int &y)
{
if (y == )
{
if (x & )
y++;
else
x++;
}
else if (y == m)
{
if (x & )
x++;
else
y--;
}
else if (x & )
y++;
else
y--;
} int main()
{
while (scanf("%d%d%d", &n, &m, &k) != EOF)
{
int x = , y = ;
int cnt = k;
while (cnt > )
{
printf("");
printf(" %d %d", x, y);
next(x, y);
printf(" %d %d\n", x, y);
next(x, y);
cnt--;
}
printf("%d", n*m-*(k-));
while (x >= && x <= n && y >= && y <= m)
{
printf(" %d %d", x, y);
next(x, y);
}
puts("");
}
return ;
}

codeforces 441C. Valera and Tubes 解题报告的更多相关文章

  1. Codeforces 441C Valera and Tubes

    题目链接:Codeforces 441C Valera and Tubes 没看到r >= 2一直错.让前几个管子占用2个格子.最后一个把剩下的都占用了.假设问题有解.这样做一定有解.其它策略就 ...

  2. codeforces 441B. Valera and Fruits 解题报告

    题目链接:http://codeforces.com/problemset/problem/441/B 题目意思:有 n 棵fruit trees,每课水果树有两个参数描述:水果成熟的时间和这棵树上水 ...

  3. codeforces B. Valera and Contest 解题报告

    题目链接:http://codeforces.com/problemset/problem/369/B 题目意思:给出6个整数, n, k, l, r, sall, sk ,需要找出一个满足下列条件的 ...

  4. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

  5. codeforces 476C.Dreamoon and Sums 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...

  6. Codeforces Round #382 (Div. 2) 解题报告

    CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...

  7. codeforces 507B. Amr and Pins 解题报告

    题目链接:http://codeforces.com/problemset/problem/507/B 题目意思:给出圆的半径,以及圆心坐标和最终圆心要到达的坐标位置.问最少步数是多少.移动见下图.( ...

  8. codeforces 500B.New Year Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/500/B 题目意思:给出一个含有 n 个数的排列:p1, p2, ..., pn-1, pn.紧接着是一个 ...

  9. codeforces B. Xenia and Ringroad 解题报告

    题目链接:http://codeforces.com/problemset/problem/339/B 题目理解不难,这句是解题的关键 In order to complete the i-th ta ...

随机推荐

  1. hdu 5012 bfs 康托展开

    Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  2. Laravel 之文件上传

    配置文件: config/filesystems.php, 新建存储空间 'uplaods' => [ 'driver' => 'local', 'root' => storage_ ...

  3. hdu - 2667 Proving Equivalences(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=2767 求至少添加多少条边才能变成强连通分量.统计入度为0的点和出度为0的点,取最大值即可. #include & ...

  4. centos 关于防火墙的命令

    CentOS7默认的防火墙不是iptables,而是firewalle. 安装iptable iptable-service #先检查是否安装了iptables service iptables st ...

  5. 洛谷——P3576 [POI2014]MRO-Ant colony

    P3576 [POI2014]MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. ...

  6. Jetson TK1 二:usb无线网卡的使用

    一.总体是按照群里的文档“TK1连接无线网络”的步骤操作的,但也遇到了一些问题,如下: 1.自动配置设备并下载内核源代码到指定的目录下时(估计是解压时),出现时间超前之类的问题,原因是当前本地时间是几 ...

  7. Hadoop学习(一)生态体系之简介

    Hadoop 系列(一)基本概念 一.Hadoop 简介 Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构,它可以使用户在不了解分布式底层细节的情況下开发分布式程序,充分利用集群 ...

  8. MySQL 索引及其用法

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  9. iOS 内存管理实践

    内存管理实践 尽管基本的概念在内存管理策略文章中简单得阐述了,但是还有一些实用的步骤让你更容易管理内存:有助于确保你的程序最大限度地减少资源需求的同时,保持可靠和强大. 使用“访问器方法”让内存管理更 ...

  10. git-flow 工作流 备忘清单

    关于 git-flow 是一个 git 扩展集,按 Vincent Driessen 的分支模型提供高层次的库操作. 查看详情 ★ ★ ★ 这个备忘清单展示了 git-flow 的基本操作和效果. ★ ...