#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <list> #include <stack> #include <queue> #include <cstdio> #include <cstdlib> #include <string> #include <set> #include <map> #include <unordered_map> #include <deque> #include <tuple> #include <bitset> #define ios std::ios::sync_with_stdio(false);std::cin.tie(0) #define endl '\n' #define MAXINT 1e9+7 #define ll long long #define pb push_back #define mpr make_pair #define FOR(i,m,n) for(int i = m;i < n;i++) #define FORR(i,m,n) for(int i = m;i >= n;i--) #define FOR_epr(i,m,epr) for(int i = m;epr;i++) #define FORR_epr(i,m,epr) for(int i = m;epr;i--) using namespace std; int dir[4][2] = {{1,1},{1,-1},{1,1},{-1,1}}; int dirPoint =-1; map<pair<int,int>,int> mp; void preprocess(){ int cnt = 0; for(int i = 0,j = 0;i < 5010 && j < 5010;){ mp[mpr(i,j)] = cnt++; i += dir[(++dirPoint)%4][0]; j += dir[(dirPoint)%4][1]; } } void solve() { preprocess(); int x,y; while(cin>>x>>y){ //cin>>x>>y; if(mp.count(mpr(x,y))) cout<<mp[mpr(x,y)]<<endl; else cout<<"No Number"<<endl; } } int main() { ios; int T = 1; //cin >> T; while (T--) solve(); return 0; }
找不出规律的直接模拟也可以,预处理出题目所给范围内的所有有数字的坐标,用map维护,之后每遇到一对坐标直接查询即可。