Untitled
unknown
plain_text
2 years ago
3.5 kB
2
Indexable
- Số test case T (T <= 50) - Trong mỗi TC, hàng đầu tiên sẽ cho: + Kích thước bản đồ N x M (5 <= N, M <= 50) + Vị trí bình xăng (vị trí xuất phát) (chỉ số 0 điểm) + Giới hạn của bơm P (1 <= P <= 20) - Chi tiết bản đồ sẽ được đưa ra ở các hàng N tiếp theo, giá trị C của mỗi ô đại diện cho các đường ống (tổng cộng 7 loại ống, 0 < = C < = 7), giá trị 0 có nghĩa là không có đường ống tại vị trí đó. 5 = > Tổng cộng 5 trường hợp kiểm thử 5 6 2 1 3 => Kích thước của bản đồ là 5 x 6, điểm xuất phát là (2,1), giới hạn của máy bơm là 3 0 0 5 3 6 0 => Hàng đầu tiên của bản đồ 0 0 2 0 2 0 => Hàng thứ hai của bản đồ 3 3 1 3 7 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 2 2 6 3 0 0 0 0 3 2 0 0 0 0 6 1 3 1 1 3 1 2 0 2 0 0 2 0 0 4 3 1 1 // Trường hợp #1 5 Trường hợp #2 15 Trường hợp #3 29 ///// #include <iostream> using namespace std; int qx[1000], qy[1000], f=-1,r=-1; void Push(int x, int y) { r++; qx[r]=x; qy[r]=y; } void Pop(int& x, int& y) { f++; x=qx[f]; y=qy[f]; } void Reset() { f=r=-1; } bool isEmpty() { return f==r; } int pumpLimit; int N, M; int pipes[50][50]; int visited[50][50]; int dtx[8][5]= { 0, 0,0,0,0, 0,-1,0,1,0, 0,-1,0,1,0, 0, 0,0,0,0, 0,-1,0,0,0, 0, 0,0,1,0, 0, 0,0,1,0, 0,-1,0,0,0, }; int dty[8][5]= { 0,0,0,0, 0, 0,0,1,0,-1, 0,0,0,0, 0, 0,0,1,0,-1, 0,0,1,0, 0, 0,0,1,0, 0, 0,0,0,0,-1, 0,0,0,0,-1, }; struct Point { int x, y; }; bool isValidConnection(int cd, int nd) { switch (cd) { case 1: return (nd==3); case 2: return (nd==4); case 3: return (nd==1); case 4: return (nd==2); } return false; } bool isValid(int x, int y, int N, int M) { return x >= 0 && x < N && y >= 0 && y < M; } int calculatePipes(Point start) { Reset(); Push(start.x, start.y); visited[start.x][start.y] = 1; int count = 0; int res=1; while (!isEmpty()) { int currentX,currentY; Pop(currentX,currentY); if (visited[currentX][currentY] == pumpLimit) break; for (int i = 1; i <= 4; i++) { if(dtx[pipes[currentX][currentY]][i]!=0 || dty[pipes[currentX][currentY]][i] != 0) { int nx = currentX + dtx[pipes[currentX][currentY]][i]; int ny = currentY + dty[pipes[currentX][currentY]][i]; if (isValid(nx, ny, N, M) && visited[nx][ny]==0 && pipes[nx][ny] != 0) { for(int j=1; j<=4; j++) { if(dtx[pipes[nx][ny]][j]!=0 || dty[pipes[nx][ny]][j] != 0) { if (isValidConnection(i,j)) { res++; Push(nx,ny); visited[nx][ny] = visited[currentX][currentY]+1; } } } } } } } return res; } int main() { //freopen("Text.txt","r",stdin); int T; cin >> T; for (int t = 1; t <= T; t++) { int startX, startY; cin >> N >> M >> startX >> startY >> pumpLimit; Point p; p.x=startX; p.y=startY; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> pipes[i][j]; visited[i][j]=0; } } int totalPipes = calculatePipes(p); cout << "Case #" << t <<endl<< totalPipes << endl; } return 0; }
Editor is loading...