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
}
}