Untitled
unknown
plain_text
a year ago
9.6 kB
7
Indexable
Gold,Fire,Ads,Ship //HugoDaoVang #include<iostream> using namespace std; #define MAX_INT 100000007 int t, tc, n, m, rear, front; int a[21][21], vX[5], vY[5], qX[500], qY[500], visited[5][21][21], ans, max_kc, dem; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0 , -1}; void initQueue() { rear = front = -1; } int isEmpty() { if(front == rear) return 1; return 0; } void enQueue(int x, int y) { rear++; qX[rear] = x; qY[rear] = y; } int deQueueX() { if(!isEmpty()) return qX[front + 1]; return -1; } int deQueueY() { if(!isEmpty()) { front++; return qY[front]; } return -1; } void BFS(int v, int i, int j) { initQueue(); visited[v][i][j] = 1; enQueue(i, j); int x, y, tx, ty; while(!isEmpty()) { x = deQueueX(); y = deQueueY(); for(int k = 0; k < 4; k++) { tx = x + dx[k]; ty = y + dy[k]; if(tx > 0 && tx <= n && ty > 0 && ty <= n && visited[v][tx][ty] == 0 && a[tx][ty] != 0) { enQueue(tx, ty); visited[v][tx][ty] = visited[v][x][y] + 1; } } } } int main() { freopen("input.txt", "r", stdin); cin >> t; for(tc = 1; tc <= t; tc++) { cin >> n >> m; int i, j, x; for(i = 1; i <= m; i++) { cin >> vX[i]; cin >> vY[i]; } for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { cin >> a[i][j]; } } for(x = 1; x <= m; x++) { a[vX[x]][vY[x]] = 2; for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) visited[x][i][j] = 0; } for(i = 1; i <= m; i++) { BFS(i, vX[i], vY[i]); } ans = MAX_INT; for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { if(a[i][j] == 1) { max_kc = 0; dem = 0; for(x = 1; x <= m; x++) { if(visited[x][i][j]) dem++; if(max_kc < visited[x][i][j]) max_kc = visited[x][i][j]; } if(dem == m && ans > max_kc) ans = max_kc; } } } if(ans == MAX_INT) { cout << "Case #" << tc << endl; cout << -1 << endl; } else { cout << "Case #" << tc << endl; cout << ans - 1 << endl; } } return 0; } //Hugo Fire #include <iostream> using namespace std; int N; // so hang int M; // so cot int SX, SY; //start row, start column int numFire, xFire[300],yFire[300] ,start, last; int numLake, xLake[225], yLake[225]; int numExit, xExit[225], yExit[225]; int dinamond[20][20], fire[20][20], lake[20][20], gate[20][20]; int maxtime, ans; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; int visited[20][20]; void BFS() { int x, y, xNext, yNext; for(int i = 0; i < last; i++) { fire[xFire[i]][yFire[i]] = 1; } while(start != last) { x = xFire[start]; y = yFire[start++]; for(int i = 0; i < 4; i++) { xNext = x + dx[i]; yNext = y + dy[i]; if(xNext >= 1 && xNext <= N && yNext >= 1 && yNext <= M) { if(lake[xNext][yNext] == 0 && (fire[xNext][yNext] == 0 || fire[xNext][yNext] > fire[x][y] + 1)) { fire[xNext][yNext] = fire[x][y] + 1; xFire[last] = xNext; yFire[last++] = yNext; } } } } } void BT(int time, int score, int x, int y) { //cout << x << "\t" << y << endl; visited[x][y] = 1; if(gate[x][y] == 1) { if(score > ans) ans = score; } for(int i = 0; i < 4; i++) { int xNext = x + dx[i]; int yNext = y + dy[i]; if(xNext >= 1 && xNext <= N && yNext >= 1 && yNext <= M) { if(visited[xNext][yNext] == 0) { if(lake[xNext][yNext] == 1) BT(time+2, score + dinamond[xNext][yNext], xNext, yNext); else if (fire[xNext][yNext] == 0 ||fire[xNext][yNext] > time + 1) BT(time+1, score + dinamond[xNext][yNext], xNext, yNext); } } } visited[x][y] = 0; } int main() { freopen("input.txt", "r", stdin); int T; cin >> T; for(int tc = 1; tc <= T; tc++) { ans = -1; maxtime = 1; start = 0; last = 0; cin >> N >> M >> SX >> SY; cin >> numFire; for(int i = 0; i < numFire; i++) { cin >> xFire[last]; cin >> yFire[last++]; } cin >> numLake; for (int i = 0; i < numLake; i++) cin >> xLake[i] >> yLake[i]; cin >> numExit; for(int i = 0; i < numExit; i++) cin >> xExit[i] >> yExit[i]; for(int i = 1; i <= N; i++) for(int j = 1; j <= M; j++) { cin >> dinamond[i][j]; fire[i][j] = 0; lake[i][j] = 0; gate[i][j] = 0; visited[i][j] = 0; } for(int i = 0; i < numFire; i++) fire[xFire[i]][yFire[i]] = 1; for(int i = 0; i < numLake; i++) lake[xLake[i]][yLake[i]] = 1; for(int i = 0; i < numExit; i++) gate[xExit[i]][yExit[i]] = 1; BFS(); maxtime = 0; for(int i = 0; i < numExit; i++) if(maxtime < fire[xExit[i]][yExit[i]]) maxtime = fire[xExit[i]][yExit[i]]; BT(1, dinamond[SX][SY], SX, SY); cout << "Case #" << tc << endl << ans << endl; } return 0; } //Hugo DiTau #include<iostream> using namespace std; int tc, n, door1, cntTrain, currTrain; int atrain[3][3], ghe[2][61]; int dx[] = { -1, 1 }; int absx(int k) { return k > 0 ? k : k * -1; } void lenTau(int dir, int k1) { currTrain = 0; int cnt = atrain[2][k1]; while(cnt > 0) { int x = atrain[1][k1]; if(ghe[0][x] == 0) { ghe[0][x] = 1; ghe[1][x] = k1 + 1; currTrain += 1; //kx++; cnt--; if(!cnt) return; } for(int l = 1;; l++) { if(dir == 1) { for(int k = 0; k < 2; k++) { int x2 = x + dx[k] * l; if(x2 > 0 && x2 <= n && ghe[0][x2] == 0) { ghe[0][x2] = absx(x2 - x) + 1; ghe[1][x2] = k1 + 1; currTrain += absx(x2 - x) + 1; cnt--; if(!cnt) return; } } } else { for(int k = 1; k >= 0; k--) { int x2 = x + dx[k] * l; if(x2 > 0 && x2 <= n && ghe[0][x2] == 0) { ghe[0][x2] = absx(x2 - x) + 1; ghe[1][x2] = k1 + 1; currTrain += absx(x2 - x) + 1; cnt--; if(!cnt) return; } } } } } } void xuongTau(int k) { int cnt = atrain[2][k]; for(int i = 0; i <= n; i++) { if(ghe[1][i] == k + 1) { ghe[0][i] = 0; ghe[1][i] = 0; cnt--; if(!cnt) return; } } } void backtrack(int door, int curr) { if(!door) { cntTrain = min(cntTrain, curr); return; } for(int i = 0; i < 3; i++) { if(atrain[0][i] == 1) { for(int k1 = 1; k1 <= 2; k1++) { lenTau(k1, i); atrain[0][i] = 0; backtrack(door - 1, curr + currTrain); xuongTau(i); atrain[0][i] = 1; } } } } int main() { freopen("input.txt", "r", stdin); cin >> tc; for(int t = 1; t <= tc; t++) { cin >> n; for(int i = 0; i < 3; i++) { cin >> atrain[1][i] >> atrain[2][i]; atrain[0][i] = 1; } door1 = 3; cntTrain = 1000; backtrack(door1, 0); cout << "Case #" << t << endl << cntTrain << endl; } return 0; } //xeplich quang cao #include <iostream> using namespace std; int N, ans; int timeAds[3], pointAds[3]; int visit[3], beginAds[3], endAds[3], cur_point[3]; int arrive[55], duration[55]; void nhap() { cin >> N; for(int i = 0; i < 3; i++) { cin >> timeAds[i]; } for(int i = 0; i < 3; i++) { cin >> pointAds[i]; } for(int i = 0; i < N; i++) { cin >> arrive[i] >> duration[i]; } } void sum(int k) { int sum = 0; for(int i = 0; i < N; i++) { int point = 0; for(int j = 0; j < k; j++) { if(arrive[i] <= beginAds[j] && arrive[i] + duration[i] >= endAds[j]) { if(cur_point[j] > point) { point = cur_point[j]; } } } sum += point; } if(sum > ans) { ans = sum; } } void backtrack(int time, int k) { if(time > 50 || k == 3) { sum(k); return; } backtrack(time + 1, k); for(int i = 0; i < 3; i++) { if(!visit[i]) { visit[i] = 1; beginAds[k] = time; endAds[k] = time + timeAds[i]; cur_point[k] = pointAds[i]; backtrack(endAds[k], k + 1); visit[i] = 0; } } } int main() { freopen("INP.txt", "r", stdin); int T; cin >> T; for(int tc = 1; tc <= T; tc++) { nhap(); ans = 0; backtrack(1, 0); cout << "Case #" << tc << endl; cout << ans << endl; } return 0; } //HugoGiaoHang #include <iostream> using namespace std; int T, Sx, Sy, Hx, Hy, N, res, ans; int place[3][15]; int dis[15][15]; bool visit[15]; //int hoanvi[12]; void nhap() { cin >> Sx >> Sy >> Hx >> Hy; cin >> N; for(int i = 0; i <= N; i++) { visit[i] = true; } place[0][0] = Sx; place[1][0] = Sy; place[0][N + 1] = Hx; place[1][N + 1] = Hy; for(int i = 1; i <= N; i++) { int x, y; cin >> x >> y; place[0][i] = x; place[1][i] = y; } int h = N + 1; for(int i = 1; i <= N; i++) { int x = place[0][h] > place[0][i] ? (place[0][h] - place[0][i]) : (place[0][i] - place[0][h]); int y = place[1][h] > place[1][i] ? (place[1][h] - place[1][i]) : (place[1][i] - place[1][h]); dis[i][h] = x + y; } for(int i = 0; i < N; i++) { for(int j = i + 1; j <= N; j++) { int x = place[0][i] > place[0][j] ? (place[0][i] - place[0][j]) : (place[0][j] - place[0][i]); int y = place[1][i] > place[1][j] ? (place[1][i] - place[1][j]) : (place[1][j] - place[1][i]); dis[i][j] = x + y; dis[j][i] = dis[i][j]; } } } void backtrack(int x, int tmp) { if(ans > res) return; for(int i = 1; i <= N; i++) { if(visit[i]) { visit[i] = false; // hoanvi[x] = dis[tmp][i]; ans += dis[tmp][i]; if(x == N) { int tmp = ans + dis[i][N + 1]; if(tmp < res) res = tmp; } else backtrack(x + 1, i); ans -= dis[tmp][i]; visit[i] = true; } } } int main() { freopen("INP.txt", "r", stdin); cin >> T; for(int tc = 1; tc <= T; tc++) { nhap(); res = 10000000; ans = 0; backtrack(1, 0); cout << "Case #" << tc << " " << res << endl; } return 0; }
Editor is loading...
Leave a Comment