题目链接: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. Mysql 实现篮球比赛赛程中两支队伍的查询

    表结构如下: 查询两支队伍的比赛情况,sql语句如下: SELECT t1.team_name,g.team1_score,g.team2_score,t2.team_name,g.gametime ...

  2. [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别

    [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别: applicationFrame会自动判断是否存在状态栏, ...

  3. mysqldumpslow不是内部或外部命令,也不是可运行的程序

    mysqldumpslow不是内部或外部命令,也不是可运行的程序 window系统,mysql版本:5.7.14. 使用mysqldumpslow命令分析日志时,报错:mysqldumpslow'不是 ...

  4. VScode开发Vue初尝试(一)

    由于公司近期有新的H5项目开发,而前端的同事也离职了,所以就临时顶缸,研究学习一下Vue框架开发. 本人也是初学,在学习过程中,把一些学习所得分享出来,可能会有很多问题和疏漏,希望大家能够多多指正,共 ...

  5. Jetson TK1 四:重新安装系统(刷机)

    转载:http://blog.sina.com.cn/s/blog_bab3fa030102vk21.html Jetson TK1是NVIDIA基于Tegra K1开发的一块低成本开发板,板载一块T ...

  6. mysql获取子父级节点

    获取所有子节点 DROP FUNCTION IF EXISTS `F_Co29_GetAllChildrenIdsOfTaskevent`;DELIMITER //CREATE FUNCTION `F ...

  7. Object中的wait,notify,notifyAll基本使用(转)

    让线程停止运行/睡眠的方法只有两个:Thread.sleep()或者obj.wait() 记住obj.nofity()并不能停止线程运行,因为notify虽然释放了锁,但依然会急促执行完synchro ...

  8. 从机器码理解RIP 相对寻址

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/rip-relative-addressing 本博客同步在 ...

  9. [ACM] POJ 3253 Fence Repair (Huffman树思想,优先队列)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25274   Accepted: 8131 Des ...

  10. centos下的hadoop服务器的配置

    是我安装CentOS服务器的过程,记录下来,与大家一起分享. 安装操作系统 CentOS 6.2 ,CentOS-6.2-i386-bin-DVD1.iso(32位) ,CentOS-6.2-x86_ ...