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 |
哪位大哥帮忙看一下啊。。。。找不到哪里wa#include <iostream> #include <algorithm> #include <vector> using namespace std; #define MAX 31 class Pos { public: int nRow; int nCol; Pos(int row = 0, int col = 0) { nRow = row; nCol = col; } bool operator==(Pos p) { return ((nCol == p.nCol) && (nRow == p.nRow)); } }; int nRobot, nTransPos; vector<Pos> vRobot; vector<Pos> vTrans; vector<Pos> vDebris; Pos MyPos; bool MovePosition(int nDirection, vector<Pos> &vDebrisPos, vector<Pos> &vRobotPos, Pos &myPosition, int &distance) { myPosition.nRow += ((nDirection - 1) / 3 - 1); myPosition.nCol += ((nDirection - 1) % 3 - 1); if (myPosition.nCol <= 0 || myPosition.nCol > MAX || myPosition.nRow <= 0 || myPosition.nRow > MAX) { return false; } vector<Pos>::iterator it; it = find(vDebrisPos.begin(), vDebrisPos.end(), myPosition); if (it != vDebrisPos.end()) { it->nRow += ((nDirection - 1) / 3 - 1); it->nCol += ((nDirection - 1) % 3 - 1); if (it->nCol <= 0 || it->nCol > MAX || it->nRow <= 0 || it->nRow > MAX) { return false; } } bool bSuccess = true; for (int i = 0; i < vRobotPos.size(); i++) { if (vRobotPos[i].nRow < myPosition.nRow) { vRobotPos[i].nRow++; if (vRobotPos[i].nCol < myPosition.nCol) { vRobotPos[i].nCol++; } else if (vRobotPos[i].nCol > myPosition.nCol) { vRobotPos[i].nCol--; } } else if (vRobotPos[i].nRow == myPosition.nRow) { if (vRobotPos[i].nCol < myPosition.nCol) { vRobotPos[i].nCol++; } else if (vRobotPos[i].nCol > myPosition.nCol) { vRobotPos[i].nCol--; } } else if (vRobotPos[i].nRow > myPosition.nRow) { vRobotPos[i].nRow--; if (vRobotPos[i].nCol < myPosition.nCol) { vRobotPos[i].nCol++; } else if (vRobotPos[i].nCol > myPosition.nCol) { vRobotPos[i].nCol--; } } if (vRobotPos[i] == myPosition) { bSuccess = false; } if (find(vDebrisPos.begin(), vDebrisPos.end(), Pos(vRobotPos[i].nRow, vRobotPos[i].nCol)) != vDebrisPos.end()) { vRobotPos.erase(vRobotPos.begin() + i); i--; } else { for (int j = 0; j < vRobotPos.size(); j++) { if (j == i) { continue; } if (vRobotPos[j] == vRobotPos[i]) { vDebrisPos.push_back(vRobotPos[i]); if (j > i) { vRobotPos.erase(vRobotPos.begin() + j); vRobotPos.erase(vRobotPos.begin() + i); i -= 1; } else if (j < i) { vRobotPos.erase(vRobotPos.begin() + i); vRobotPos.erase(vRobotPos.begin() + j); i -= 2; } break; } } if (vRobotPos.size() == 0) { break; } } } if (!bSuccess) { return false; } distance = 70; for (int i = 0; i < vRobotPos.size(); i++) { if (abs(myPosition.nRow - vRobotPos[i].nRow) + abs(myPosition.nCol - vRobotPos[i].nCol) < distance) { distance = abs(myPosition.nRow - vRobotPos[i].nRow) + abs(myPosition.nCol - vRobotPos[i].nCol); } } return bSuccess; } bool DecideMove() { int nDeleteRobot = -1; vector<Pos> resultDebris; vector<Pos> resultRobot; Pos resultPos; int nMaxDis = 0; for (int i = 1; i <= 9; i++) { vector<Pos> vRobotPosition(vRobot); vector<Pos> vDebrisPos(vDebris); Pos myPosition = MyPos; int nDistance = 0; if (MovePosition(i, vDebrisPos, vRobotPosition, myPosition, nDistance)) { int nDelete = vRobot.size() - vRobotPosition.size(); if (nDelete > nDeleteRobot) { nDeleteRobot = nDelete; resultDebris = vDebrisPos; resultPos = myPosition; resultRobot = vRobotPosition; nMaxDis = nDistance; } else if (nDelete == nDeleteRobot) { if (nDistance > nMaxDis) { resultDebris = vDebrisPos; resultPos = myPosition; resultRobot = vRobotPosition; nMaxDis = nDistance; } } } } if (nDeleteRobot == -1) { return false; } vRobot = resultRobot; vDebris = resultDebris; MyPos = resultPos; return true; } int main() { cin>>nRobot>>nTransPos; int nCase = 0; while(nRobot != 0) { nCase++; int nMove = 0; MyPos.nRow = 15; MyPos.nCol = 15; vRobot.clear(); vTrans.clear(); vDebris.clear(); int row, col; for (int i = 0; i < nRobot; i++) { cin>>row>>col; vRobot.push_back(Pos(row, col)); } for (int i = 0; i < nTransPos; i++) { cin>>row>>col; vTrans.push_back(Pos(row, col)); } cout<<"Case "<<nCase<<":"<<endl; while(true) { nMove++; if (DecideMove()) { if (vRobot.size() == 0) { cout<<"Won game after making "<<nMove<<" moves."<<endl; cout<<"Final position: ("<<MyPos.nRow<<","<<MyPos.nCol<<")"<<endl; cout<<"Number of cells with debris: "<<vDebris.size()<<endl<<endl; break; } } else { bool bMove = false; for (int i = 0; i < vTrans.size(); i++) { if (find(vRobot.begin(), vRobot.end(), Pos(vTrans[i].nRow, vTrans[i].nCol)) == vRobot.end() && find(vDebris.begin(), vDebris.end(), Pos(vTrans[i].nRow, vTrans[i].nCol)) == vDebris.end()) { Pos savePos = MyPos; MyPos.nRow = vTrans[i].nRow; MyPos.nCol = vTrans[i].nCol; int nDis = 0; if (MovePosition(5, vDebris, vRobot, MyPos, nDis)) { bMove = true; cout<<"Move "<<nMove<<": teleport to ("<<MyPos.nRow<<","<<MyPos.nCol<<")"<<endl; vTrans.erase(vTrans.begin() + i); break; } else { MyPos = savePos; } } } if (!bMove) { int nDis = 0; MovePosition(5, vDebris, vRobot, MyPos, nDis); cout<<"Lost game after making "<<nMove<<" moves."<<endl; cout<<"Final position: ("<<MyPos.nRow<<","<<MyPos.nCol<<")"<<endl; cout<<"Number of cells with debris: "<<vDebris.size()<<endl; cout<<"Number of robots remaining: "<<vRobot.size()<<endl<<endl; break; } } } cin>>nRobot>>nTransPos; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator