# d406: 倒水時間
題目連結:[d406](https://zerojudge.tw/ShowProblem?problemid=d406)
這題比較適合BFS
因為水流的是一樣的時間
我的作法是找到一個點
將它附近的點放進Queue裡
再從Queue裡pop出點來
再將pop出來附近的點放進Queue裡
如此模擬水流
那將經過的點標上做了幾次模擬的次數即為解
以下為程式碼:
```c=
#include<stdio.h>
#include<queue>
#include<iostream>
#include<utility>
using namespace std;
int dx[] = {1, 0, 0, -1};
int dy[] = {0, -1, 1, 0};
int main(){
int marked[100][100];
int arr[100][100];
int x,y,i,j,r,c,s,nr,nc,o=1;
while(scanf("%d%d%d",&s,&x,&y)!=EOF){
int marked[100][100]={0};
for(i=0;i<x;i++){
for(j=0;j<y;j++){
scanf("%d",&arr[i][j]);
if(i==0&&arr[i][j]==1){
r=i;
c=j;
}
}
}
queue< pair<int,int> > q;
q.push({r,c});
marked[r][c]=1;
while(!q.empty()){
r = q.front().first;
c = q.front().second;
q.pop();
for(i=0;i<5-s;i++){
nr=r+dx[i];
nc=c+dy[i];
if(nr<0||nc<0||nr>=x||nc>=y){
continue;
}
if(arr[nr][nc]==0){
continue;
}
if(marked[nr][nc]>0){
continue;
}
marked[nr][nc]=marked[r][c]+1;
q.push({nr,nc});
}
}
printf("Case %d:\n",o);
o++;
for(i=0;i<x;i++){
for(j=0;j<y;j++){
printf("%d ",marked[i][j]);
}
printf("\n");
}
}
return 0;
}
```
以下就是模擬水流的迴圈
當Queue為空時就是已經流到終點的了
```c=
while(!q.empty()){
r = q.front().first;
c = q.front().second;
q.pop();
for(i=0;i<5-s;i++){
nr=r+dx[i];
nc=c+dy[i];
if(nr<0||nc<0||nr>=x||nc>=y){
continue;
}
if(arr[nr][nc]==0){
continue;
}
if(marked[nr][nc]>0){
continue;
}
marked[nr][nc]=marked[r][c]+1;
q.push({nr,nc});
}
}
```