题解 CF1740D

CF1740D

这个题说实话比 \(C\) 题要好想/jk,但是我没有在考场上写出来,写出来了但是没交上

这个题只需要记录一下终点当前时刻,需要放置下标的棋子(姑且叫它棋子),以及当前棋盘上剩余的空间即可

记录终点应放置的棋子是为了检验当前起点放置的物品是否可以直接放置到终点上

  • 如果不是,就需要将其放在棋盘上任意位置,除了终点和起点,并且不能放置在其他物品上方,(当时没仔细读题,写了一个可以在棋盘其他位置按顺序放置的代码挂掉了qwq)

  • 如果是的话,就需要检验应该按顺序放置在他的上方的棋子是否已经从起点出来,出来了就需要将其放置到终点上,同时棋盘的空位将多出来一个,如果没有那就直接进行下一次操作

这里要注意,每次移动时的空间只需要有 \(4\) 个,因为可以像华容道一样移动,但是其他棋子不能触碰到终点和起点,所以是 \(4\) 个,空间满了,就直接输出不可以的选项即可

/*
#date	:10/29/2022
#editor	:apple_tyr/Apollo_tyr
#problem or
 contest:CF1740D
*/
#include<map>
#include<string.h>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
const int N=1e5+10;
int T,n,m,k;
int a[N];
int vis[N];
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&k);
		int cnt=k,kk=0;
		bool f=1;
		for(int i=1;i<=k;i++){
			scanf("%d",&a[i]);
			vis[i]=0;
		}
		for(int i=1;i<=k;i++){
			if(kk<n*m-3){
				if(a[i]==cnt){
					cnt--;
					while(vis[cnt]==1){
						kk--;
						vis[cnt]=0;
						cnt--;
					}
				}else{
					vis[a[i]]=1;
					kk++;			
				}
			}else{
				puts("TIDAK");
				f=0;
				break ;			
			}
		}
		if(f){
			puts("YA");
		}
	}
	return 0;
}
posted @ 2022-11-30 09:02  Tyrue  阅读(22)  评论(0编辑  收藏  举报