Codeforces Round #630 (Div. 2) 比赛人数12012
[codeforces 1332A] Exercising Walk 排除所有不可能,剩下的就是可能
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1332/problem/A
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
A - Exercising Walk | GNU C++11 | Accepted | 30 ms | 0 KB |
赛后看,该题挺简单的。
比赛时也是这么认为的。可是,思维到了,能力到了,却栽在了编码上。提交WA,一度以为此场比赛就交代在这道题上了。
反反复复读题,没有问题。举了些例子,没问题。
读了几遍代码,突然发现,行移动判断,列移动判断,应是各自独立的,不能写在同一个判断逻辑里,将else if改成了if,提交,立马AC.
该题思路如下:
若左右需移动,则最少要有2列
若上下需移动,则最少要有2行
若a,b均有值,可扣除min(a,b)部分,因为一左一右,或者一右一左,相等部分就可抵消。剩下部分,看看是一直左走,还是一直右走,记得不要走出边界。
若c,d均有值,可扣除min(c,d)部分,因为一上一下,或者一下一上,相等部分就可抵消。剩下部分,看看是一直上走,还是一直下走,记得不要走出边界。
AC代码如下
#include <stdio.h>
int main(){
int a,b,c,d,x,y,x1,y1,x2,y2,X,Y,t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&a,&b,&c,&d);
scanf("%d%d%d%d%d%d",&x,&y,&x1,&y1,&x2,&y2);
X=x2-x1,Y=y2-y1;
if(a>0||b>0){
if(X==0){
printf("No\n");
continue;
}
}
if(c>0||d>0){
if(Y==0){
printf("No\n");
continue;
}
}
if(a>b){
if(x-(a-b)<x1){
printf("No\n");
continue;
}
}else if(a<b){
if(x+(b-a)>x2){
printf("No\n");
continue;
}
}
if(c>d){
if(y-(c-d)<y1){
printf("No\n");
continue;
}
}else if(c<d){
if(y+(d-c)>y2){
printf("No\n");
continue;
}
}
printf("Yes\n");
}
return 0;
}