| ||||||||||
| 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 | |||||||||
竟然1A!自己都不敢相信~~~【附代妈】#include <iostream>
#include <stdio.h>
using namespace std;
struct point{
int x;
int y;
};
int R, T;
int state[32][32];//0: empty -1: 堆玻璃 >0: robots,是几就是第几个robot
point robotList[55];//robot所在的位置
point teleList[22];
bool destroyed[55];
bool used[22];//teleport是否已经使用
point pos;
int numRobot;
int numSteps;
int ABS(int a){
if(a < 0) return -a;
return a;
}
bool inRange(int x, int y){
return x>=1 && x<=31 && y>=1 && y<=31;
}
bool inRange(point p){
return inRange(p.x, p.y);
}
bool init(){
scanf("%d%d", &R, &T);
if(R == 0 && T == 0) return false;
pos.x = 15;
pos.y = 15;
for(int i = 1; i <= 31; i++){
for(int j = 1; j <= 31; j++){
state[i][j] = 0;
}
}
for(int i = 1; i <= R; i++){
scanf("%d%d", &robotList[i].x, &robotList[i].y);
state[robotList[i].x][robotList[i].y] = i;
destroyed[i] = false;
}
for(int i = 1; i <= T; i++){
scanf("%d%d", &teleList[i].x, &teleList[i].y);
used[i] = false;
}
numRobot = R;
numSteps = 0;
return true;
}
void robotMove(int x, int y, int& rNum, int State[32][32], point rList[55], bool Destroyed[55]){
for(int i = 1; i <= R; i++){
if(Destroyed[i]) continue;
//首先㞎原来的位置置零
State[rList[i].x][rList[i].y] = 0;
if(rList[i].x < x) rList[i].x++;
else if(rList[i].x > x) rList[i].x--;
if(rList[i].y < y) rList[i].y++;
else if(rList[i].y > y) rList[i].y--;
}
for(int i = 1; i <= R; i++){
if(Destroyed[i]) continue;
if(State[rList[i].x][rList[i].y] == -1){
Destroyed[i] = true;
rNum --;
}
else if(State[rList[i].x][rList[i].y] == 0){
State[rList[i].x][rList[i].y] = i;
}
else{
int yuanI = State[rList[i].x][rList[i].y];
Destroyed[yuanI] = true;
Destroyed[i] = true;
rNum -= 2;
State[rList[i].x][rList[i].y] = -1;
}
}
}
int main() {
int cases = 0;
while(init()){
cases ++;
printf("Case %d:\n", cases);
while(1){
numSteps ++;
bool buTele = false;
int tempState[9][32][32];
point tempRobotList[9][55];
bool tempDestroyed[9][55];
int tempNumRobot = 55;
int tempMaxMinDist = 0;
int argMove = -1;
for(int moveNo = 0; moveNo < 9; moveNo++){
int robotNum = numRobot;
int rowOffset = moveNo/3-1, colOffset = moveNo%3-1;
int newRow = pos.x+rowOffset, newCol = pos.y+colOffset;
int tuiRow = newRow + rowOffset, tuiCol = newCol + colOffset;
//判断移动是否合法
bool debris = inRange(newRow, newCol) && inRange(tuiRow, tuiCol) && state[newRow][newCol] == -1 && state[tuiRow][tuiCol] != -1;
bool hefa = (rowOffset==0 && colOffset==0) ||
(inRange(newRow, newCol) && ((state[newRow][newCol] == 0) || debris));
if(!hefa) continue;
//复制现场
for(int i = 0; i < 32; i++){
for(int j = 0; j < 32; j++){
tempState[moveNo][i][j] = state[i][j];
}
}
for(int i = 1; i <= R; i++){
tempRobotList[moveNo][i] = robotList[i];
tempDestroyed[moveNo][i] = destroyed[i];
}
//如果是堆玻璃
if(debris){
int idxR = state[tuiRow][tuiCol];
if(idxR > 0){
robotNum --;
tempDestroyed[moveNo][idxR] = true;
}
tempState[moveNo][tuiRow][tuiCol] = -1;
tempState[moveNo][newRow][newCol] = 0;
}
//判断是否直接萎掉
bool weidiao = false;
for(int i = -1; i <= 1; i++){
for(int j = -1; j <= 1; j++){
if(inRange(newRow+i, newCol+j) && tempState[moveNo][newRow+i][newCol+j] > 0){
weidiao = true;
break;
}
}
if(weidiao) break;
}
if(weidiao) continue;
//至少没萎掉,所以不用用teleport了
buTele = true;
robotMove(newRow, newCol, robotNum, tempState[moveNo], tempRobotList[moveNo], tempDestroyed[moveNo]);
int minDist = 200;
for(int i = 1; i <= R; i++){
if(tempDestroyed[moveNo][i]){
continue;
}
int tempDist = ABS(newRow-tempRobotList[moveNo][i].x) + ABS(newCol-tempRobotList[moveNo][i].y);
if(tempDist < minDist) minDist = tempDist;
}
if(robotNum < tempNumRobot || (robotNum == tempNumRobot && minDist > tempMaxMinDist)){
tempMaxMinDist = minDist;
tempNumRobot = robotNum;
argMove = moveNo;
}
}
if(buTele){
//复制回原数据中
numRobot = tempNumRobot;
for(int i = 0; i < 32; i++){
for(int j = 0; j < 32; j++){
state[i][j] = tempState[argMove][i][j];
}
}
for(int i = 1; i <= R; i++){
robotList[i] = tempRobotList[argMove][i];
destroyed[i] = tempDestroyed[argMove][i];
}
pos.x = pos.x+argMove/3-1, pos.y = pos.y+argMove%3-1;
if(numRobot == 0){
printf("Won game after making %d moves.\n", numSteps);
printf("Final position: (%d,%d)\n", pos.x, pos.y);
int debrisNum = 0;
for(int i = 1; i < 32; i++){
for(int j = 1; j < 32; j++){
if(state[i][j] == -1) debrisNum ++;
}
}
printf("Number of cells with debris: %d\n\n", debrisNum);
break;
}
continue;
}
int TeleNum = -1;
//首先确定tele的编号
for(int i = 1; i <= T; i++){
if(used[i]) continue;
int nX = teleList[i].x, nY = teleList[i].y;
if(state[nX][nY] != 0) continue;
bool guadiao = false;
for(int j = -1; j <= 1; j++){
for(int k = -1; k <= 1; k++){
if(inRange(nX+j, nY+k) && state[nX+j][nY+k] > 0){
guadiao = true;
break;
}
}
if(guadiao) break;
}
if(guadiao) continue;
TeleNum = i;
used[i] = true;
break;
}
if(TeleNum > 0){
pos.x = teleList[TeleNum].x, pos.y = teleList[TeleNum].y;
printf("Move %d: teleport to (%d,%d)\n", numSteps, pos.x, pos.y);
robotMove(pos.x, pos.y, numRobot, state, robotList, destroyed);
if(numRobot == 0){
printf("Won game after making %d moves.\n", numSteps);
printf("Final position: (%d,%d)\n", pos.x, pos.y);
int debrisNum = 0;
for(int i = 1; i < 32; i++){
for(int j = 1; j < 32; j++){
if(state[i][j] == -1) debrisNum ++;
}
}
printf("Number of cells with debris: %d\n\n", debrisNum);
break;
}
}
else{
//挫败了
robotMove(pos.x, pos.y, numRobot, state, robotList, destroyed);
printf("Lost game after making %d moves.\n", numSteps);
printf("Final position: (%d,%d)\n", pos.x, pos.y);
int debrisNum = 0;
for(int i = 1; i < 32; i++){
for(int j = 1; j < 32; j++){
if(state[i][j] == -1) debrisNum ++;
}
}
printf("Number of cells with debris: %d\n", debrisNum);
printf("Number of robots remaining: %d\n\n", numRobot);
break;
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator