zj说,我们一起做一道题吧!
我说好啊!
十分钟之后..
"wa x1"
我打了个框架...
五分钟后
"wa x2"
zj打游戏去了.....
半个小时之后我终于样例过了...
我"你正方形考虑了吗"
zj:"啊!天呢"
然后zj就ac了
然后我五个小时之后还在wa...
我..
样例试了试都差不多我还是放弃吧emmmm= =
ac的代码到处都有....
我写一下经验教训吧
1.可以用set,但是这个自动是不重复的排序好了的集合
所以要重载比较
****结构体中的比较
bool friend operator<(node x,node y)
{if(x.x1>y.x2)return true;
if(x.x1==y.x1&&x.x2>y.x2)return true;
return false;
}
2.使用set要清空
用clear()..不然呢?
就像每次用的flag药放到循环里面一样啊
3.参考前面那几个题,不用开大数组存起来,而且数据只用一次(类似)所以直接每6round开一个循环就好了,我很暴力的一次读入6个
4.要特判正方形的1情况
5.4 1 1 现象,开始用的无序的set是不行的
用multiset返回count可以解决
写法是s1.count(node[i]);
6. 1 1 2 2 3 3 现象特判 了
7.我是边数和.. 两个框的,所以比了2次
结构体里面,是每个都等于2才可以
边数里面,每个都是4才可以
8.之前想因为不好表示的话,只要首个和尾数
#include<iostream>
#include<set>
#include<map>
using namespace std;
struct node{
int x1;
int x2;
//int count;
bool friend operator<(node x, node y)
{
if (x.x1<y.x1) return true;
if (x.x1 == y.x1&&x.x2<y.x2) return true;
// if(x.x1 == y.x1&&x.x2=y.x2&&x.count<y.count) return true;
return false;
}
}node1[6];
//用set存一下,所以无序的最后size==3;
// 然后比较一下1 2 3
int main()
{
multiset<node>s1;
multiset<int>s2;
while (cin >> node1[0].x1 >> node1[0].x2 >> node1[1].x1 >> node1[1].x2 >> node1[2].x1 >> node1[2].x2 >> node1[3].x1 >> node1[3].x2 >> node1[4].x1 >> node1[4].x2 >> node1[5].x1 >> node1[5].x2){
s1.clear();
s2.clear();
bool flag = true;
for (int i = 0; i < 6; i++)
{
if (node1[i].x1>node1[i].x2)
{
int temp;
temp = node1[i].x1;
node1[i].x1 = node1[i].x2;
node1[i].x2 = temp;
}// to make sure small to big
s1.insert(node1[i]);
s2.insert(node1[i].x1);
s2.insert(node1[i].x2);
}
/// 2 2 2 可以 3 3
if (s1.count(node1[0]) == 6 && s2.count(node1[0].x1) == 12)
flag = true;
else if (node1[0].x1 == node1[0].x2)
flag = false;
else if (s1.count(node1[0]) != 2||s1.count(node1[3])!=2|| s1.count(node1[5]) != 2)
flag = false;
//的确不行啊= = 3个的话真的差得很多
// else if()
//flag=true;
// 怎么确定是三个边呢? 6 个数如何确定两两相同?
else if (s2.count(node1[0].x1) != 4 || s2.count(node1[0].x2) != 4||s2.count(node1[1].x1) != 4 || s2.count(node1[1].x2) != 4||s2.count(node1[2].x1) != 4 || s2.count(node1[2].x2) != 4||s2.count(node1[3].x1) != 4 || s2.count(node1[3].x2) != 4||s2.count(node1[4].x1) != 4 || s2.count(node1[4].x2) != 4||s2.count(node1[5].x1) != 4 || s2.count(node1[5].x2) != 4)
flag = false;
if (!flag)
cout << "IMPOSSIBLE" << endl;
else
cout << "POSSIBLE" << endl;
}
return 0;
}
//其实晚上看了看.. 对于 1 2 1 2 1 1 1 1 1 1 1 1 这组,就没法判断了....
所以说还是啊...正向考虑就可以了,拔毛.. 拔不干净....
不是主流诶.... 并且大家都没和你这么写,,,,
1.每个面都能找到他的对面
2.每条边都能重叠
其实就可以了
唉 思考问题的角度啊
溜了溜了 等有空登qq补一下zj的图