题目传送门
代码传送门
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;
}