有天他来到一张方格地图上,整张地图可以看做一个二维坐标轴。牛牛此刻处于原点(0,0),他想要到点(x,y)去。
牛牛有强迫症,他规定自己必须恰好k步走到点(x,y),中途可以经过任何点包括(x,y),但是第k步一定要到达(x,y)。
一步有八种走法,直线东(+1,0)南(0,-1)西(-1,0)北(0,+1),斜线东南(+1,-1)东北(+1,+1)西南(-1,-1)西北(-1,+1)。
第一行一个整数T,代表数据组数。
每组数据给出三个整数x,y,k。
对于每组数据,单独一行输出一个整数。
如果牛牛可以在第k步的时候到达(x,y),输出牛牛走的斜线数量。
如果牛牛不能到达,输出-1。
2 2 3 4 7 7 9
3 9
1 1 2 1
-1
对于100%的数据,1<=T<=1000,1<=x,y,k<=1000000000000000000。
# Python版本,通过所有算例,供参考 def judge(x, y, k): x = abs(x) y = abs(y) if k < max(x, y): return -1 elif k == max(x, y): if (x+y) % 2 == 0: return k elif (x+y) % 2 == 1: return k-1 elif k > max(x, y): if (k - max(x, y)) % 2 == 0: if (x + y) % 2 == 0: return k elif (x + y) % 2 == 1: return k - 1 elif (k - max(x, y)) % 2 == 1: if (x + y) % 2 == 0: return k - 2 elif (x + y) % 2 == 1: return k - 1 n = int(input()) a = [[] for i in range(n)] for i in range(n): a[i] = input().split() for i in range(n): for j in range(len(a[i])): a[i][j] = int(a[i][j]) for i in range(n): x = a[i][0] y = a[i][1] k = a[i][2] res = judge(x, y, k) print(res)
#include<iostream> using namespace std; int main(){ int n; cin >> n; while(n){ long long int x, y, k; cin >> x >> y >> k; long long int max = x < y?y:x; long long int min = x > y?y:x; if (k < max){ cout << "-1" << endl; }else{ long long int t = min + (max-min)/2*2; if((max-min)%2 == 0){ if((k - t)%2 == 0){ cout << k << endl; }else{ cout << k - 2 << endl; } }else{ cout << k-1 << endl; } } n--; } return 0; }一直没发通过测试,看了其他人的答案才发现int小了,存不下
#include <iostream> using namespace std; long long max(long long x, long long y){ return x>y?x:y; } void getStep(long long x, long long y, long long k){ long long minstep,remins; long long sum=x+y; if(sum%2==0){ minstep=max(x,y); if(k<minstep) cout<<-1<<endl; else{ remins=k-minstep; if(remins%2==0) cout<<k<<endl; else cout<<k-2<<endl; } }else{ if(x>y) minstep=x-1; else minstep=y-1; if(k<minstep+1) cout<<-1<<endl; else cout<<k-1<<endl; } return; } int main(){ long long t,x,y,k; cin>>t; while(t-->0){ cin>>x>>y>>k; getStep(x,y,k); } return 0; }