题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3682
题目大意:给一个n*n*n的立方体,由1*1*1的小格子组成,起始坐标为(1,1,1),然后给出m条直线,直线经过的地方格子都会被削掉,一个格子只能被削掉一次,求m条直线能削掉多少个格子。直线给出的方式形如:Y=1,Z=3 与坐标面平行,且每条直线必经过立方体。
解题思路:感觉很水的一道题啊,卡的那叫一个……无语……
遍历直线在立方体上经过的每一个点例如(x,y,z),用vector存储hash后的值:temp = x * n * n + y * n + z,之后对vector进行排序,删除重复的即可!
unique用法:
前提条件:必须先对所需要进行unique操作的数组排序,然后再使用unique。
实际上unique函数实现的只是把不同的元素“unique”放到数组的前面,而数组的后面还有一段重复的没有去掉。这个时候就可以利用到unique函数的返回值,它返回的就是重复元素出现的第一个位置。
另外,unique函数可以接受两个参数(数组的开头,数组的末尾),也可以接受三个参数(数组的开头,数组的末尾,两个元素的比较(即定义怎样算元素相等))
代码实现:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> vet;
int main()
{
int t;
int n, m;
char a, b;
int a_val, b_val;
scanf("%d", &t);
for(int i = 0; i < t; i ++)
{
scanf("%d %d", &n, &m);
vet.clear();
getchar();
for(int i = 0; i < m; i ++)
{
scanf("%c=%d,%c=%d",&a, &a_val, &b, &b_val);
getchar();
if(a == 'X')
{
if(b == 'Y')
{
for(int i = 1; i <= n; i ++)
{
int temp = a_val * n * n + b_val * n + i;
vet.push_back(temp);
}
}
else
{
for(int i = 1 ; i <= n; i ++)
{
int temp = a_val * n * n + i * n + b_val;
vet.push_back(temp);
}
}
}
else if(a == 'Y')
{
if(b =='X')
{
for(int i = 1; i <= n; i ++)
{
int temp = b_val * n * n + a_val * n + i;
vet.push_back(temp);
}
}
else
{
for(int i = 1; i <= n; i ++)
{
int temp = i * n * n + a_val * n + b_val;
vet.push_back(temp);
}
}
}
else
{
if(b == 'X')
{
for(int i = 1; i <= n ; i ++)
{
int temp = b_val * n * n + i * n + a_val;
vet.push_back(temp);
}
}
else
{
for(int i = 1; i <= n ; i ++)
{
int temp = i * n * n + b_val * n + a_val;
vet.push_back(temp);
}
}
}
}
sort(vet.begin(), vet.end());
vet.erase(unique(vet.begin(), vet.end()), vet.end());
printf("%d\n", vet.size());
}
return 0;
}