题目链接: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 ;
}

最新文章

  1. JQuery效果-淡入淡出、滑动、动画
  2. asp.net 时间操作
  3. 集合的知识点梳理(List,Set,不包含泛型)
  4. php的预定义数组
  5. VS2012中进行Web性能和负载测试
  6. CAS分析——Core
  7. 一步一步重写 CodeIgniter 框架 (8) —— 视图的嵌套输出与返回
  8. SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
  9. ecshop foreach循环判断循环次数
  10. Sping--life cycle
  11. jQuery动画高级用法(上)——详解animation中的.queue()动画队列插队函数
  12. 【转载】如何查看Mysql是否已经安装
  13. 解决idea spring boot项目中target中没有同步更新最新目录文件及资源
  14. 64位平台C/C++容易犯的错误
  15. python len()函数的用法
  16. bpmn.js &amp; BPMN diagram
  17. 理解BFC
  18. 执行shell文件是,提示chmod: 更改&#39;./shell1.sh&#39; 的权限: 不允许的操作。
  19. hdoj:2061
  20. 决策树1 -- ID3_C4.5算法

热门文章

  1. 【SPOJ687&amp;POJ3693】Maximum repetition substring(后缀数组)
  2. 频繁项挖掘算法Apriori和FGrowth
  3. 标准C程序设计七---23
  4. Xcode6 pch文件
  5. Scrapy学习-7-数据存储至数据库
  6. Nginx反向代理新篇-使用location对多个URL做反向代理
  7. 分布式架构和微服务CI/CD的范本技术解读
  8. [ZJOI 2018] 线图
  9. JVM内存分为哪几部分?各个部分的作用是什么?
  10. .net core mvc启动顺序以及主要部件1