Untitled
unknown
plain_text
a year ago
1.9 kB
7
Indexable
#include<iostream> using namespace std; int N, M; int P; // giới hạn bơm // mảng 8 loại đường ống int type[8][4]={ 0,0,0,0, 1,1,1,1, 1,0,1,0, 0,1,0,1, 1,1,0,0, 0,1,1,0, 0,0,1,1, 1,0,0,1 }; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int visit[51][51]; // mảng thăm int cntN[51][51]; // mảng lan truyền int map[51][51]; // mang đường ống int Qx[10000]; int Qy[10000]; int rear, front; int cnt; //đếm số đường ống int main(){ int T; int x_mb,y_mb; freopen("input.txt", "r", stdin); cin>>T; for (int tc = 1; tc <= T; tc++) { cnt = 1; cin>>N>>M>>x_mb>>y_mb>>P; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin>>map[i][j]; } } reset(); BFS(x_mb,y_mb); cout<<"Case #"<<tc<<endl; cout<<cnt<<endl; } return 0; } bool check(int x, int y){ if(x >= 0 && x < N && y >= 0 && y < M)return true; return false; } void BFS(int x_mb, int y_mb){ front = rear = 0; Qx[rear] = x_mb; Qy[rear++] = y_mb; visit[x_mb][y_mb] = 1; cntN[x_mb][y_mb] = 1; while (front < rear){ int x = Qx[front]; int y = Qy[front++]; for (int i = 0; i < 4; i++){ int nx = x + dx[i]; // vị trí sắp đi đến int ny = y + dy[i]; if(check(nx, ny)) // check vị trí sắp đi đến { if(map[nx][ny] != 0 && visit[nx][ny] == 0 && type[map[x][y]][i] == 1 && type[map[nx][ny]][(i+2)%4] == 1) { // nếu vị trí sắp tới khác 0, chưa thăm, đầu của 2 loại ống phù hợp nhau cntN[nx][ny] = cntN[x][y] + 1; // lan truyền giới hạn bơm if(cntN[nx][ny] > P)return; cnt++; Qx[rear] = nx; Qy[rear++] = ny; visit[nx][ny] = 1; } } } } } void reset(){ for (int i = 0; i <= N; i++){ for (int j = 0; j <= M; j++){ visit[i][j] = 0; cntN[i][j] = 0; } } }
Editor is loading...
Leave a Comment