1. 程式人生 > >2015 ACM/ICPC北京賽區現場賽G

2015 ACM/ICPC北京賽區現場賽G

題意:

給你四個矩形,從中選出3個矩形【讀題的時候沒有看出只選三個矩形,交了三發罰時】,判斷是否可以組成一個大的矩形

分析:

暴力深搜,先全排列判斷順序。。然後判斷前兩個是否可以組成一個新的,然後把這個矩形傳遞下去

程式碼:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int a[10];
int b[10];
int c[10];
int ok;
void dfs(int x,int y,int len)
{
    if(ok==1)return;
    if(len==3)
    {
        ok=1;
        return;
    }
    if(x==a[c[len]])
        dfs(x,y+b[c[len]],len+1);
    if(x==b[c[len]])
        dfs(x,y+a[c[len]],len+1);
    if(y==a[c[len]])
        dfs(x+b[c[len]],y,len+1);
    if(y==b[c[len]])
        dfs(x+a[c[len]],y,len+1);
}
int main()
{
    int t,i,j;
    scanf("%d",&t);
    while(t--)
    {
        ok=-1;
        for(i=0;i<4;i++)
            scanf("%d%d",&a[i],&b[i]);
        for(int i=0;i<4;i++) c[i]=i;
        do
        {
            if(ok==1)break;
            dfs(a[c[0]],b[c[0]],1);
        }while(next_permutation(c,c+4));

        if(ok==1)
            printf("Yes\n");
        else
            printf("No\n");
    }
}
/*
10
4 8 3 8 1 7 6 8
4 8 3 8 1 7 6 7
1 1 1 1 1 2 2 2
1 1 2 2 10 10 20 20
2 1 2 1 2 4 3 6
6 3 4 2 2 1 1 2

*/