本文主要是介绍AtCoder - 平铺,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
D - Tiling
给一个网格的宽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;
}
这篇关于AtCoder - 平铺的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!