题目描述
秤是由秤杆、绳、和物品组成,每个秤杆被一根连着中点处的绳子挂着,杆子的两端也都挂着一根绳子,下面可以直接挂物品,也可以挂另一个秤杆,秤杆可以任意旋转。
现在给你两把秤,要求判断这两把秤是否一样。秤的表示方法如下,假设秤一共有N个秤杆,用1到N来编号,1号秤杆总是最上面的那个秤杆,每个秤杆两边悬挂物品或者是另一个秤杆,物品用一个负数或0来表示物品的种类(-9999..0),而用正数表示悬挂的秤杆的编号。
Input
输入包含两把秤的描述,秤的描述方法如下:第一行输入一个整数N(1<=N<=100,000)表示秤中秤杆的数量,接下来N行,每行两个整数,表示第i个秤杆两边悬挂的情况。
Output
如果两把秤不同输出“Fred and Mary have different mobiles.”,否则输出“Fred and Mary might have the same mobile.”。
Sample Input
5
2 3
4 5
-1 -2
-3 -4
-5 -6
5
2 5
-1 -2
-3 -4
-5 -6
3 4
Sample Output
Fred and Mary might have the same mobile.
分析
此题题面讲的十分隐晦,然后我发现了秤杆的如下特征:两头都可以系东西,最后的杆头必定都系上了物品。
这不就一棵二叉树嘛。
然后仔细思考了一下,可以通过遍历比较叶子节点的相同与否,判断两个秤是否相等。
然后遍历时有三种情况(是对应的,如果不对应的就肯定返回false了)
1、双方两头都是秤杆,随便分情况遍历遍历就好
2、双方一头都是物品,一头都是秤杆,那么物品的直接判断,秤杆的继续遍历
3、双方两头都是物品,判断即可,这也是遍历到末尾的标志
然后根据返回值的真假输出即可
#include <iostream>
#include <cstdio>
using namespace std;
int n1,n2;
long long s1[100101][2],s2[100101][2];
long long t1[100101],t2[100101];
bool dfs(int node1,int node2)
{
if (s1[node1][0]<=0&&s2[node2][0]<=0&&s1[node1][1]<=0&&s2[node2][1]<=0) return s1[node1][0]==s2[node2][0]&&s1[node1][1]==s2[node2][1]||s1[node1][1]==s2[node2][0]&&s1[node1][0]==s2[node2][1];
if (s1[node1][0]<=0&&s2[node2][0]<=0&&s1[node1][1]>0&&s2[node2][1]>0) return s1[node1][0]==s2[node2][0]&&dfs(s1[node1][1],s2[node2][1]);
if (s1[node1][1]<=0&&s2[node2][1]<=0&&s1[node1][0]>0&&s2[node2][0]>0) return s1[node1][1]==s2[node2][1]&&dfs(s1[node1][0],s2[node2][0]);
if (s1[node1][1]<=0&&s2[node2][0]<=0&&s1[node1][0]>0&&s2[node2][1]>0) return s1[node1][1]==s2[node2][0]&&dfs(s1[node1][0],s2[node2][1]);
if (s1[node1][0]<=0&&s2[node2][1]<=0&&s1[node1][1]>0&&s2[node2][0]>0) return s1[node1][0]==s2[node2][1]&&dfs(s1[node1][1],s2[node2][0]);
if (s1[node1][0]>0&&s2[node2][0]>0&&s1[node1][1]>0&&s2[node2][1]>0) return dfs(s1[node1][0],s2[node2][0])&&dfs(s1[node1][1],s2[node2][1])||dfs(s1[node1][1],s2[node2][0])&&dfs(s1[node1][0],s2[node2][1]);
return false;
}
void fir()
{
int i;
scanf("%d",&n1);
for (i=1;i<=n1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
s1[i][0]=a;
s1[i][1]=b;
}
}
void sec()
{
int i;
scanf("%d",&n2);
for (i=1;i<=n2;i++)
{
int a,b;
scanf("%d%d",&a,&b);
s2[i][0]=a;
s2[i][1]=b;
}
}
void doit()
{
if (dfs(1,1))
printf("Fred and Mary might have the same mobile.");
else
printf("Fred and Mary have different mobiles.");
}
int main()
{
fir();
sec();
doit();
}
本文介绍了一种将秤的结构抽象为二叉树的方法,并通过递归遍历来判断两个秤是否相同。讨论了遍历过程中遇到的不同情况及其处理方式。
2万+

被折叠的 条评论
为什么被折叠?



