给一个网格的宽W和高H(1<=W,H<=10)以及n(1<=n<=7)个矩形的长ai和宽bi(1<=ai,bi<=10),判断是否可以用矩形铺满整个网格,不能越界和重叠。
输入样例:
5 5 5
1 1
3 3
4 4
2 3
2 5
输出样例:
Yes
#include<iostream>
using namespace std;
int a[10],b[10];
bool vis[15];
bool st[15][15];
int h,w,n;
bool check(int x,int y,int a,int b){
if(x+a-1>h||y+b-1>w) return 0;
for(int i=x;i<=x+a-1;i++){
for(int j=y;j<=y+b-1;j++){
if(st[i][j]) return 0;
}
}
return 1;
}
void set(int x,int y,int a,int b){
if(x+a-1>h||y+b-1>w) return ;
for(int i=x;i<=x+a-1;i++){
for(int j=y;j<=y+b-1;j++){
st[i][j]=1;
}
}
}
void erase(int x,int y,int a,int b){
if(x+a-1>h||y+b-1>w) return ;
for(int i=x;i<=x+a-1;i++){
for(int j=y;j<=y+b-1;j++){
st[i][j]=0;
}
}
}
void dfs(int x,int y){
if(y==w+1){
y=1;
x++;
}
if(x==h+1){
cout<<"Yes"<<endl;
exit(0);
}
while(st[x][y]){
y++;
if(y==w+1){
y=1;
x++;
}
if(x==h+1){
cout<<"Yes"<<endl;
exit(0);
}
}
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(check(x,y,a[i],b[i])){
vis[i]=1;
set(x,y,a[i],b[i]);
dfs(x,y+b[i]);
erase(x,y,a[i],b[i]);
vis[i]=0;
}
if(a[i]==b[i]) continue;
swap(a[i],b[i]);
if(check(x,y,a[i],b[i])){
vis[i]=1;
set(x,y,a[i],b[i]);
dfs(x,y+b[i]);
erase(x,y,a[i],b[i]);
vis[i]=0;
}
swap(a[i],b[i]);
}
}
int main(){
cin>>n>>h>>w;
for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
dfs(1,1);
cout<<"No"<<endl;
return 0;
}