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