这道题目是一道模拟题目,但是我想的过程中遇到了很多问题,感觉脑袋很乱的感觉。最后参考了别人的代码:http://www.xue5.com/Developer/Software/684397.html
自己照着他的思想重写了一遍,但是比他写的要长。思想是:每次走一步,这需要用d数组来记录到起始点的距离,如果有两滴水同时到达的情况,则可以根据距离判断,直接将该格子的值++。
//7908622 2013-03-28 11:07:35 Accepted 4527 15MS 224K 2612 B G++ chen #include<stdio.h> #include<stdlib.h> #include<queue> using namespace std; struct Node{ int x,y,direc; }; int mat[6][6]; int d[6][6]; int m,x,y; int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; queue<Node> q; bool isOk(int x,int y){ if(x<0||y<0||x>=6||y>=6) return 0; return 1; } int main(){ while(scanf("%d%d%d%d%d%d",&mat[0][0],&mat[0][1],&mat[0][2],&mat[0][3],&mat[0][4],&mat[0][5])!=EOF){ for(int i=1;i<6;i++) for(int j=0;j<6;j++) scanf("%d",&mat[i][j]); scanf("%d",&m); while(m--){ memset(d,0,sizeof(d)); scanf("%d%d",&x,&y); x--,y--;//一开始这儿忘记减1了 if(mat[x][y]<4) mat[x][y]++; else{ mat[x][y]=0; d[x][y]=0; Node nd; nd.x=x; nd.y=y; nd.direc=-1; q.push(nd); while(!q.empty()){ Node tmp=q.front();q.pop(); //分成四个方向的水滴 Node nx; if(tmp.direc==-1){ mat[tmp.x][tmp.y]=0; for(int i=0;i<4;i++){ int xx=tmp.x+dir[i][0]; int yy=tmp.y+dir[i][1]; if(isOk(xx,yy)){ if(mat[xx][yy]==0){ d[xx][yy]=d[tmp.x][tmp.y]+1; nx.x=xx,nx.y=yy,nx.direc=i; q.push(nx); }else if(mat[xx][yy]>0&&mat[xx][yy]<4){ d[xx][yy]=d[tmp.x][tmp.y]+1; mat[xx][yy]++; }else if(mat[xx][yy]==4){ d[xx][yy]=d[tmp.x][tmp.y]+1; nx.x=xx,nx.y=yy,nx.direc=-1; q.push(nx); mat[xx][yy]++; }else if(d[xx][yy]==d[tmp.x][tmp.y]+1) mat[xx][yy]++; }//if }//for }//if else{ int xx=tmp.x+dir[tmp.direc][0]; int yy=tmp.y+dir[tmp.direc][1]; if(isOk(xx,yy)){ if(mat[xx][yy]==0){ d[xx][yy]=d[tmp.x][tmp.y]+1; nx.x=xx,nx.y=yy,nx.direc=tmp.direc; q.push(nx); }else if(mat[xx][yy]>0&&mat[xx][yy]<4){ d[xx][yy]=d[tmp.x][tmp.y]+1; mat[xx][yy]++; }else if(mat[xx][yy]==4){ d[xx][yy]=d[tmp.x][tmp.y]+1; nx.x=xx,nx.y=yy,nx.direc=-1; q.push(nx); mat[xx][yy]++; }else if(d[xx][yy]==d[tmp.x][tmp.y]+1) mat[xx][yy]++; } }//else }//while }//else }//m for(int i=0;i<6;i++){ for(int j=0;j<6;j++){ if(j==0) printf("%d",mat[i][j]); else printf(" %d",mat[i][j]); } printf("\n"); } printf("\n"); } //system("pause"); return 0; }