刚开始把它想成了贪心,结果怎么也出不来,结果只是简单地dfs加上回溯
将一个方格看做一个点,刚开始全部置为0,若有物品放置,则置为1;
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf -0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
int n;
int mp[50][50];
int flag=0;
struct node{
int x;
int y;
}node[15];
void change(int i1,int j1,int x,int y,int num){
for(int i=i1;i<i1+x;i++)
for(int j=j1;j<j1+y;j++)
mp[i][j]=num;
}
void dfs(int k){
if(k>=n){
flag=1;
return ;
}
int sign=0;
for(int i=0;i<10;i++) //横着放
for(int j=0;j<10;j++){
sign=0;
if(mp[i][j]==0&&i+node[k].x<=10&&j+node[k].y<=10){
for(int a=i;a<i+node[k].x;a++){
for(int b=j;b<j+node[k].y;b++){
if(mp[a][b]==1){
sign=1;
break;
}
}
if(sign==1)
break;
}
if(!sign){
change(i,j,node[k].x,node[k].y,1);
dfs(k+1);
change(i,j,node[k].x,node[k].y,0);
}
}
if(flag)
return ;
sign=0;
if(mp[i][j]==0&&i+node[k].y<=10&&j+node[k].x<=10){ //竖着放
for(int a=i;a<i+node[k].y;a++){
for(int b=j;b<j+node[k].x;b++){
if(mp[a][b]==1){
sign=1;
break;
}
}
if(sign==1)
break;
}
if(!sign){
change(i,j,node[k].y,node[k].x,1);
dfs(k+1);
change(i,j,node[k].y,node[k].x,0);
}
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
mem0(mp);
int sum=0;
for(int i=0;i<n;i++){
scanf("%d%d",&node[i].x,&node[i].y);
sum+=node[i].x*node[i].y;
}
flag=0;
if(sum>100){
cout<<"No"<<endl;
continue;
}
dfs(0);
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}