给你一个由无穷个节点组成的三角形(如下图),你的任务很简单——任意给你两个正整数x和y,判断它们是否相邻(重合不是相邻)。
Input
第一行T,表示T组测试数据,接下来仅有两个32位正整数x 和y。
Output
对于每组测试数据,首先输出”Case k:”,其中k表示第几组。然后如果x和y相邻,则输出“Yes”,否则输出“No”。
Sample Input
3
1 1
1 2
1 11
Sample Output
Case 1:No
Case 2:Yes
Case 3:No
Source
yixiang
一开始的时候,我的思路是把每一个数字的行数都打表,然后通过比较两个数字的位置比较,判断是否处在相邻的位置,却发现会WA,可能是限制的条件没找好,然后我换了一种思路;把其中一个数周围的位置枚举出来,然后与另外一个数字比较,标记下来就可以了。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<string>
#include<string.h>
using namespace std;
#define maxn 5000505
int f[maxn]; //打表数组;
int main()
{
int t,flag=1,ans=1,step=2;
memset(f,0,sizeof(f));
f[1]=1;
for(int i=2;i<=maxn;i++)
{
f[i]=step; //step 记录 第几行;
if(step>ans)
ans++; // 与step比较,看是否在同一行;
else
{
step++;
ans=1;
}
}
scanf("%d",&t);
while(t--)
{
int x,y,cmcc=0;
scanf("%d%d",&x,&y);
if(x==y) // 特判;
{
printf("Case %d:No\n",flag++);
continue;
}
if(x<y)
swap(x,y); // 让x成为大的那个;
if(f[x-1]==f[x]-1) // 如果x是在最左边的那一列;
{
if(y==x-f[x-1])
cmcc=1;
}
else if(f[x]+1==f[x+1])//如果x是在最右边那一列;
{
if(y==x-1||y==x-f[x])
cmcc=1;
}
else if(f[x]-1==f[y]) // 如果x,y在不同行;
{
if(x==y+f[x]||x==y+f[y])
cmcc=1;
}
else if(f[x]==f[y]) // 如果x,y在同一行;
{
if(x==y+1)
cmcc=1;
}
//之前的代码,没有过,可能是考虑不周吧。
// if(f[y]+1==f[x]&&x-y==1)
// cmcc=0;
// else if(x==y+1&&f[x]==f[y])
// cmcc=1;
// else if((x-y==f[x]||x-y==f[y])&&f[x]-f[y]==1)
// cmcc=1;
printf("Case %d:%s\n",flag++,cmcc==1?"Yes":"No");
}
return 0;
}