toj3858. Home

刚开始把它想成了贪心,结果怎么也出不来,结果只是简单地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;
}

你可能感兴趣的:(toj3858. Home)