4 4 5 10 2 1 4 2 3 3 2 4 4 3 1 2 4 3 4 4 4
0 5 0 3 0 2 1 3 0 1
思路:bfs,比赛写的时候一个小bug没看出来,思路上的一点漏洞,遗憾。
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#define DBG printf("Hi\n")
using namespace std;
#define mod 10000007
#define N 100005
typedef __int64 ll;
struct Node
{
int x,y,t,d;
bool operator<(const Node &a)const
{
return t>a.t;
}
};
int r,c,n,T;
int num[111][111];//该点大水滴的size
int id[111][111];
int q[111][2];
bool have[111][111];
int out[111][111];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
bool isok(int x,int y)
{
if (x>=0&&x<r&&y>=0&&y<c) return true;
return false;
}
int Search(int d,int x,int y,int &X,int &Y)
{
int ans=0;
while (isok(x,y)&&!have[x][y])
{
x=x+dir[d][0];
y=y+dir[d][1];
ans++;
}
if (!isok(x,y)) return -1;
X=x;Y=y;
return ans+1;
}
void bfs(int x,int y)
{
Node st,now;
priority_queue<Node>Q;
while (!Q.empty()) Q.pop();
st.x=x;st.y=y;
st.t=0;
Q.push(st);
int cnt=0;
while (!Q.empty())
{
if (cnt>=n+1) break;
st=Q.top();
Q.pop();
if (!have[st.x][st.y])
{ //比赛时这个大括号内的没写,WA
if (out[st.x][st.y]==st.t) continue;
int ss=Search(st.d,st.x,st.y,now.x,now.y);
if (ss==-1) continue;
now.d=st.d;
now.t=st.t+ss-1;
Q.push(now);
continue;
}
if (num[st.x][st.y]+1>4)
{
cnt++;
have[st.x][st.y]=false;
out[st.x][st.y]=st.t;
num[st.x][st.y]=0;
// printf("***%d\n",st.t);
for (int i=0;i<4;i++)
{
int dx=st.x+dir[i][0];
int dy=st.y+dir[i][1];
if (!isok(dx,dy)) continue;
int ss=Search(i,dx,dy,now.x,now.y);
if (ss==-1) continue;
now.t=st.t+ss;
now.d=i;
// printf("%d %d %d++\n",now.x,now.y,now.t);
if (now.t>T) continue;
Q.push(now);
}
}
else
num[st.x][st.y]++;
}
}
int main()
{
int i,j,x,y,z;
while (~scanf("%d%d%d%d",&r,&c,&n,&T))
{
memset(num,0,sizeof(num));
memset(id,-1,sizeof(id));
memset(out,0,sizeof(out));
memset(have,false,sizeof(have));
for (i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
x--;
y--;
num[x][y]=z;
have[x][y]=true;
id[x][y]=i;
}
scanf("%d%d",&x,&y);
x--;y--;
have[x][y]=true;
num[x][y]=10;
bfs(x,y);
for (i=0;i<r;i++)
{
for (j=0;j<c;j++)
{
if (id[i][j]==-1) continue;
if (have[i][j])
q[id[i][j]][0]=1,q[id[i][j]][1]=num[i][j];
else
q[id[i][j]][0]=0,q[id[i][j]][1]=out[i][j];
}
}
for (i=0;i<n;i++)
{
printf("%d %d\n",q[i][0],q[i][1]);
}
}
return 0;
}
/*
4 5 4 6
2 2 4
2 4 2
4 4 4
2 5 4
4 2
*/
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u014422052/article/details/47166091