您的位置:首页 > 运维架构

Gym 101243.C - Desktop(构造)

2017-10-11 22:11 405 查看
题意:用 2×2 的图标铺满 H×W 的桌面,要求可以重叠(后放入的图标可以部分遮盖原有图标),但每个图标必须至少露出面积为 2 ,同时要求图标的顶点必须落在整数坐标上。

思路:发现,这个图,在h为偶数的时候,可以通过(详见代码)的方式构造出答案。那么w为偶数的时候同理。可是我们要处理一个w和h均为奇数的情况,此时我们需要在h或者w的最后一行/列上铺一整条,然后就可以变成h或者w为偶数的情况了,就能像前面的构造方法一样去构造答案了。

#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>>vec;
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int h, w;
scanf("%d%d", &h, &w);
if(h < 2 || w < 2)  puts("0");
else
{
if(h % 2 == 1 && w % 2 == 1)
{
for(int i = 1; i + 1 <= w; i += 2)  vec.push_back({h - 1, i});
h--;
//等价于 h % 2 == 0
}
int a, b;
if(h % 2 == 0)
{
for(int i = 1; i + 1 <= h; i += 2)
{
for(int j = 1; j + 2 <= w; j ++)
{
vec.push_back({i, j});
}
}
for(int i = 1; i + 1 <= h; i++) vec.push_back({i, w-1});
}
else
{
for(int i = 1; i + 1 <= w; i += 2)
{
for(int j = 1; j + 2 <= h; j ++)
{
vec.push_back({j, i});
}
}
for(int i = 1; i + 1 <= w; i++) vec.push_back({h-1, i});
}

printf("%d\n", vec.size());
for(auto o : vec)   printf("%d %d\n", o.first, o.second);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: