裸搜就可以了。注意好边界条件。
传送门:http://acm.tju.edu.cn/toj/showp3858.html
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
int h[12],v[12];
bool Map[11][11];
int ans_flag;
int n;
void print() {
for(int i = 0 ; i < 10 ; i++) {
for(int j = 0 ; j < 10 ; j++) {
printf("%d ",Map[i][j]);
}
puts("");
}
puts("");
}
void DFS(int cen){
if(ans_flag)return ;
if(cen >= n) {
// puts("Hello");
ans_flag = 1;
return ;
}
//print();
for(int i = 0 ; i < 10 ; i++) {
for(int j = 0 ; j < 10 ; j ++) {
int flag = 0;
for(int ii = 0 ; ii < h[cen] ; ii ++) {
for(int jj = 0 ; jj < v[cen] ; jj ++){
if(i + ii >= 10 || j + jj >= 10 || Map[i+ii][j+jj]) {
flag = 1;
break;
}
}
}
if(flag == 0) {
for(int ii = 0 ; ii < h[cen] ; ii ++) {
for(int jj = 0 ; jj < v[cen] ; jj ++){
Map[i + ii][j + jj] = 1;
}
}
DFS(cen+1);
for(int ii = 0 ; ii < h[cen] ; ii ++) {
for(int jj = 0 ; jj < v[cen] ; jj ++){
Map[i + ii][j + jj] = 0;
}
}
}
flag = 0;
for(int ii = 0 ; ii < v[cen] ; ii ++) {
for(int jj = 0 ; jj < h[cen] ; jj ++){
if(i + ii >= 10 || j + jj >= 10 || Map[i+ii][j+jj]) {
flag = 1;
break;
}
}
}
if(flag == 0) {
for(int ii = 0 ; ii < v[cen] ; ii ++) {
for(int jj = 0 ; jj < h[cen] ; jj ++){
Map[i + ii][j + jj] = 1;
}
}
DFS(cen+1);
for(int ii = 0 ; ii < v[cen] ; ii ++) {
for(int jj = 0 ; jj < h[cen] ; jj ++){
Map[i + ii][j + jj] = 0;
}
}
}
}
}
}
void Deal_with() {
while(~scanf("%d",&n)) {
for(int i = 0 ; i < n ; i++) {
scanf("%d%d",h+i,v+i);
}
ans_flag = 0;
memset(Map,0,sizeof(Map));
DFS(0);
if(ans_flag == 0) {
puts("No");
}
else {
puts("Yes");
}
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
return 0;
}