HDU 3262 Seat taking up is tough

来源:互联网 发布:数据恢复大师靠谱吗 编辑:程序博客网 时间:2024/06/06 16:35

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

#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;}


0 0