Codeforces Round #630 (Div. 2) A. Exercising Walk(简单思维)

题目传送门

题意:给定起点和四个方向要走的步数,问能否在指定范围内完成。

思路1:考虑分上下左右讨论所有不能走的情况,剩下就是能走的。

思路2:考虑能走的情况,剩下就是不能走的。

思路1代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		int x,y,x1,y1,x2,y2;
		cin>>x>>y>>x1>>y1>>x2>>y2;
		int m=a-b,n=c-d;
		//printf("m=%d,n=%d\n",m,n);
		if((x-x1==0&&x2-x==0&&(a||b))||(y-y1==0&&y2-y==0&&(c||d))) { //如果不能往某一方向走 
			puts("NO");
			continue;
		} 
		if(m>=0){ //分上下左右四种情况讨论不能走 
			if(x-x1<m){
			 puts("NO");
			 continue;
		}
		}
		else if(x2-x+m<0){
			puts("NO");
			continue;
			}
		if(n>=0){
			if(y-y1<n){
				puts("NO");
			 continue;
			}
		}
		else if(y2-y+n<0){
			puts("NO");
			continue;
		}
		puts("YES");
	}
} 

思路2代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		int x,y,x1,y1,x2,y2;
		cin>>x>>y>>x1>>y1>>x2>>y2;
		x+=b-a,y+=d-c;
		if(x>=x1&&x<=x2&&y>=y1&&y<=y2&&(x2>x1||a+b==0)&&(y2-y1||c+d==0)) puts("YES");
		else puts("NO");//如果终点在范围内且能往该方向走或者不用走 输出YES 
	}
}