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