poj-1691-暴力DFS

感觉智商变低了。。。暴力的DFS都不会做了

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
struct list
{
    int x1,y1;
    int x2,y2;
    int c;
}node[21];
struct list2
{
    int ipos;
    int col;
}po[101],p;
int ru[21];
int maps[21][21];
int vis[21];
int n;
int maxx;
int cmp(struct list2 a,struct list2 b)
{
    return a.col<b.col;
}
void init()
{
    int i;
    maxx=99999;
    memset(ru,0,sizeof(ru));
    memset(maps,0,sizeof(maps));
    memset(vis,0,sizeof(vis));
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d%d%d%d",&node[i].x1,&node[i].y1,&node[i].x2,&node[i].y2,&node[i].c);
    }
}
int pan(int x,int y)
{
    if(node[x].x2!=node[y].x1)return 0;
    if(node[x].y1>node[y].y1&&node[x].y1<node[y].y2)return 1;
    if(node[x].y2>node[y].y1&&node[x].y2<node[y].y2)return 1;
    if(node[x].y1<=node[y].y1&&node[x].y2>=node[y].y2)return 1;
    return 0;
}
void creat()
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(i==j)continue;
            if(pan(j,i))
            {
                ru[i]++;
                maps[j][i]=1;
              //  printf("%d->%d\n",j+1,i+1);
            }
        }
    }
}
void dfs(int pre,int x)
{
   // cout<<x<<" "<<pre<<endl;
    int i,j;
    vector<int>co[21];
    int chui[21];
    int visi[21];
    memset(chui,0,sizeof(chui));
    memset(visi,0,sizeof(visi));
    for(i=0;i<n;i++)
    {
        if(vis[i]==0&&ru[i]==0&&node[i].c==pre)
        {
            vis[i]=1;
            visi[i]++;
            for(j=0;j<n;j++)
            {
                if(maps[i][j]==1)
                {
                    ru[j]--;
                    chui[j]++;
                }
            }
        }
    }
    for(i=0;i<n;i++)
    {
        if(vis[i]==0&&ru[i]==0)
        {
            co[node[i].c].push_back(i);
        }
    }
    int leap=0;
    for(i=0;i<21;i++)
    {
        int len=co[i].size();
        if(len==0)continue;
        leap=1;
        if(i==pre)
        {
            dfs(i,x);
        }
        else dfs(i,x+1);
    }
    if(leap==0)maxx=min(maxx,x);
    for(i=0;i<n;i++)
    {
        vis[i]=vis[i]-visi[i];
        ru[i]=ru[i]+chui[i];
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        init();
        creat();
        dfs(-1,0);
        cout<<maxx<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值