这道题目是一道模拟题目,但是我想的过程中遇到了很多问题,感觉脑袋很乱的感觉。最后参考了别人的代码: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;
}