ABC345,HOW D-Tiling
  • 板块学术版
  • 楼主miffy_123
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/16 22:28
  • 上次更新2024/3/17 08:46:36
查看原帖
ABC345,HOW D-Tiling
705296
miffy_123楼主2024/3/16 22:28

题目传送门

代码传送门

AC× 52

WA× 10

TLE× 20

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 2147483646
#define inf 9223372036854775806
#define pl putchar('\n');
int n,h,w;
int a[20],b[20];
bool c[20];
int N;
bool paper[15][15];
bool check(int x,int y){
	return (x>=0&&y>=0&&x<h&&y<w);
}
bool check(){
	for(int i=0;i<h;i++){
		for(int j=0;j<w;j++){
			if(paper[i][j]==0){
				return false;
			}
		}
	}
	return true;
}
bool check_gird(int x1,int y1,int x2,int y2){
	if(check(x1,y1)==false||check(x2,y2)==false){
		return false;
	}
	for(int i=x1;i<=x2;i++){
		for(int j=y1;j<=y2;j++){
			if(paper[i][j]==1){
				return false;
			}
		}
	}
	return true;
}
void mark_gird(int x1,int y1,int x2,int y2){
	for(int i=x1;i<=x2;i++){
		for(int j=y1;j<=y2;j++){
			paper[i][j]=1;
		}
	}
	return;
}
void erase_gird(int x1,int y1,int x2,int y2){
	for(int i=x1;i<=x2;i++){
		for(int j=y1;j<=y2;j++){
			paper[i][j]=0;
		}
	}
	return;
}
void dfs(){
	if(check()){
		cout<<"Yes"<<endl;
		exit(0);
	}
	for(int i=0;i<h;i++){
		for(int j=0;j<h;j++){
			if(paper[i][j]==0){
				for(int k=0;k<n;k++){
					if(c[k]==0&&check_gird(i,j,i+a[k]-1,j+b[k]-1)){
						c[k]=1;
						if(k<N){
							c[k-N]=1;
						}
						else{
							c[k+N]=1;
						}
						mark_gird(i,j,i+a[k]-1,j+b[k]-1);
						dfs();
						c[k]=0;
						if(k<N){
							c[k-N]=0;
						}
						else{
							c[k+N]=0;
						}
						erase_gird(i,j,i+a[k]-1,j+b[k]-1);
					}
				}
			}
		}
	}
	return;
}
int main(){
    cin>>n>>h>>w;
    for(int i=0;i<n;i++){
    	cin>>a[i]>>b[i];
    	a[i+n]=b[i];
    	b[i+n]=a[i];
	}
	N=n;
	n*=2;
	dfs();
	cout<<"No"<<endl;
    return 0;
}


2024/3/16 22:28
加载中...