P1014 [NOIP1999 普及组] Cantor 表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//long long arr[100001];
//long long mark[100001];
int main(){
int dir[2][2]={{1,-1},{-1,1}};
int n;cin>>n;int a=2,b=1,x=0,sign=0;
for (int i=3;i<n;i++){
if (a==1&&sign==0){
b++;
x++;
if (x>1)x--;
sign=1;
continue;
}else if (a==1&&sign==1){
x++;
if (x>1)x-=2;
sign=1;
}
if (b==1&&sign==0){
a++;
x++;
if (x>1)x-=2;
sign=1;
continue;
}else if (b==1&&sign==1){
x++;
if (x>1)x--;
sign=1;
}
sign=0;
a+=dir[x][0];
b+=dir[x][1];
}
if (n==1)
cout<<1<<'/'<<1;
else if (n==2)
cout<<1<<'/'<<2;
else
cout<<a<<'/'<<b;
}
其实可以优化一下,确实有点臃肿了(
思路就是模拟,建立一个方向数组,决定移动方向。
小细节:
1.点在边界时不一定要平移,但一定换方向
2.平移之后同样在边界,防止二次平移,定义一个sign作为标志