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 |
【DP 2216K 204MS】一个弱智的判断胜负条件错误WA了两次。。。附代妈#include <iostream> #include <stdio.h> using namespace std; int numTri[262144]; int idxLine[11][11]; int idxDots[18][2] = {{1,2},{1,3},{2,3},{2,4},{2,5},{3,5},{3,6},{4,5},{5,6},{4,7},{4,8},{5,8},{5,9},{6,9},{6,10},{7,8},{8,9},{9,10}}; int triangle[9][3] = {{0,1,2},{3,4,7},{2,4,5},{5,6,8},{9,10,15},{7,10,11},{11,12,16},{8,12,13},{13,14,17}}; inline bool hasWei(int n, int w){ return (n & (1<<w)) != 0; } int getNumTri(int n){//当前状態下的三国形个擞 if(numTri[n] != -1) return numTri[n]; if(n == 0) { numTri[0] = 0; return 0; } int cnt = 0; for(int i = 0; i < 9; i++){ if(hasWei(n, triangle[i][0]) && hasWei(n, triangle[i][1]) && hasWei(n, triangle[i][2])){ cnt ++; } } numTri[n] = cnt; return cnt; } int dp[262144]; void init(){ //cout << 1 << endl; for(int i = 0; i < 262144; i++){ numTri[i] = -1; dp[i] = -1; } for(int i = 0; i < 18; i++){ idxLine[idxDots[i][0]][idxDots[i][1]] = i; idxLine[idxDots[i][1]][idxDots[i][0]] = i; } dp[262143] = 0; //cout << 1 << endl; } int getDp(int n){ if(dp[n] != -1) return dp[n]; int mx = 0; for(int i = 0; i < 18; i++){ if(hasWei(n, i)) continue; int n_ = n | (1<<i); int temp; if(getNumTri(n_) == getNumTri(n)){ //下一步该对方走 temp = 9 - getNumTri(n) - getDp(n_); } else{ temp = getNumTri(n_) - getNumTri(n) + getDp(n_); } if(temp > mx) mx = temp; } dp[n] = mx; return mx; } int main() { init(); int cases; scanf("%d", &cases); for(int ii = 0; ii < cases; ii++){ printf("Game %d: ", ii+1); int state = 0;//当前状態 bool first = 0;//0代表A走,1代表B走 int ATri = 0, BTri = 0; int curTri = 0; int bushu; scanf("%d", &bushu); for(int i = 0; i < bushu; i++){ int d1, d2; scanf("%d%d", &d1, &d2); int idx = idxLine[d1][d2]; int qTri = curTri; state |= (1 << idx); curTri = getNumTri(state); if(curTri == qTri){ first = !first; } else{ int zengTri = curTri - qTri; if(!first) ATri += zengTri; else BTri += zengTri; } } int moreTri = getDp(state); if((!first && ATri + moreTri > 4) || (first && BTri + moreTri < 5)){ printf("A wins.\n"); } else{ printf("B wins.\n"); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator