Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这模拟题真磨死我了~我滴个妈妈啊,连写加debug弄了3个小时,终于是1Y过了~贴码留念一下~ #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 10; const int M = 15; const int px[4] = {1,-1,0,0}; const int py[4] = {0,0,1,-1}; struct node { int x, y, sum; char c; }; int n, sign[N][M]; char s[12][16]; bool visit[N][M]; node p[160]; void dfs(int x, int y, int& sum, const int& ct) { int i, tx, ty; sum++; visit[x][y] = true; sign[x][y] = ct; if(y<p[ct].y || (y==p[ct].y && x<p[ct].x)) { p[ct].x = x; p[ct].y = y; } for(i = 0; i < 4; i++) { tx = x + px[i]; ty = y + py[i]; if(tx<0 || tx>=N) continue; if(ty<0 || ty>=M) continue; if(!visit[tx][ty] && s[tx][ty]==p[ct].c) dfs(tx, ty, sum, ct); } } void Mov(int pos) { int i, j, k; bool cv[M]; for(i = 0; i < M; i++) { j = k = 0; while(k < N) { if(sign[k][i] == pos) { s[k][i] = ' '; k++; } else { s[j][i] = s[k][i]; j++; k++; } } for(k = j; k < N; k++) s[k][i] = ' '; } for(i = 0; i< M; i++) if(s[0][i] == ' ') cv[i] = true; else cv[i] = false; i = 0; for(k = 0; k < M; k++) { if(cv[k]) continue; else { for(j = 0; j < N; j++) s[j][i] = s[j][k]; i++; } } for(k = i; k < M; k++) for(j = 0; j < N; j++) s[j][k] = ' '; } int main() { int i, j, Case = 0, ct, pos, Score, t, tmp; freopen("data.txt", "r", stdin); cin >> n; while(n--) { Case++; if(Case > 1) printf("\n"); printf("Game %d:\n\n", Case); for(i = 9; i >= 0; i--) cin >> s[i]; Score = t = 0; while(1) { ct = 0; for(i = 0; i < 160; i++) { p[i].x = p[i].y = 20; p[i].sum = 0; p[i].c = ' '; } memset(sign, -1, sizeof(sign)); memset(visit, false, sizeof(visit)); for(i = 0; i < N; i++) for(j = 0; j < M; j++) { if(visit[i][j]) continue; if(s[i][j] == ' ') continue; p[ct].c = s[i][j]; dfs(i, j, p[ct].sum, ct); ct++; } pos = 0; for(i = 0; i < ct; i++) { if(p[i].sum < p[pos].sum) continue; if(p[i].sum > p[pos].sum) { pos = i; continue; } if(p[i].y<p[pos].y || (p[i].y==p[pos].y && p[i].x<p[pos].x)) pos = i; } if(p[pos].sum <= 1) break; Mov(pos); t++; tmp = p[pos].sum - 2; tmp = tmp * tmp; Score += tmp; printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n", t, p[pos].x+1, p[pos].y+1, p[pos].sum, p[pos].c, tmp); } if(ct == 0) Score += 1000; printf("Final score: %d, with %d balls remaining.\n", Score, ct); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator