首页 > 代码库 > HDU 3262 Seat taking up is tough

HDU 3262 Seat taking up is tough

这题其实挺简单,可是自己就是被坑了很长时间,究其原因,脑袋短路了。本来排完序之后,应该把结果按照未排序之前的顺序输出,结果我就直接输出了,而题目给的例子正好是按顺序给的,输出没有问题,哎,果然够坑。以后再也不能相信题目给的例子了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
int seat[31][31];
bool visited[31][31];
int m,n,k,feeling,ans_x,ans_y;
struct come
{
    int hh,mm,person;
    int id;//之前就是没有这个,总是WA。
}data[52];
struct result
{
    int x,y;
}ans[52];
bool cmp(come a,come b)
{
    if(a.hh==b.hh)
        return a.mm<b.mm;
    return a.hh<b.hh;
}
bool judge(int x,int y,int id)
{
    int k=data[id].person+y;
    if(k-1>m)
        return false;
    for(int i=y;i<k;i++)
        if(visited[x][i])
        return false;
    return true;
}
void set_true(int x,int y,int id)
{
    int k=data[id].person+y;
    for(int i=y;i<k;i++)
        visited[x][i]=true;
}
void dfs(int id)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(visited[i][j])
                continue;
            if(judge(i,j,id))
                if(feeling<seat[i][j])
                feeling=seat[i][j],ans_x=i,ans_y=j;
            if((m-j+1)<data[id].person)
                break;
        }
    }
}
void get_max()
{
    int t=-100000000;
    ans_x=0,ans_y=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
           if(visited[i][j]==false)
               if(t<seat[i][j])
                  t=seat[i][j],ans_x=i,ans_y=j;
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&k))
    {
        if(n==0&&m==0&&k==0)
            break;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            scanf("%d",&seat[i][j]);
        for(int i=1;i<=k;i++)
        {
            scanf("%d:%d %d",&data[i].hh,&data[i].mm,&data[i].person);
            data[i].id=i;
        }
        sort(data+1,data+k+1,cmp);
        memset(visited,false,sizeof(visited));
        for(int i=1;i<=k;i++)
        {
            feeling=-100000000,ans_x=0,ans_y=0;
            dfs(i);
            if(ans_x!=0)
            {
                ans[data[i].id].x=ans_x,ans[data[i].id].y=ans_y;
                set_true(ans_x,ans_y,i);
            }
            else
            {
                get_max();
                if(ans_x==0)
                    ans[data[i].id].x=-1;
                else
                {
                    ans[data[i].id].x=ans_x,ans[data[i].id].y=ans_y;
                    visited[ans_x][ans_y]=true;
                }
            }
        }
        for(int i=1;i<=k;i++)
        {
            if(ans[i].x!=-1)
                printf("%d %d\n",ans[i].x,ans[i].y);
            else
                printf("-1\n");
        }
    }
    return 0;
}


HDU 3262 Seat taking up is tough