[codeforces 1332A] Exercising Walk 排除所有不可能,剩下的就是可能

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行

扫描二维码关注公众号,回复: 10681272 查看本文章

若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;
}
发布了660 篇原创文章 · 获赞 562 · 访问量 48万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/105238571