标签:and its 码农 i++ memset using cli 多行 lan
传送门:QAQQAQ
题意:This is an interactive task.
999*999国际象棋棋盘中有一个王和666个车,玩家走王,电脑走车,玩家先走,玩家的目的是让对方的车将到自己的王,电脑的车可以“飞”(即移动到棋盘上任意一点),但吃子规则不变,玩家必须要在2000步之内获胜
思路:哇塞这是国际象棋!好激动好激动!(然而没做出来)
我们考虑一般情况:根据王的位置一横一竖把棋盘分成4个部分,加入王往一个方向走(这里假设往左上走),则除了背对他的方向其它所有车都要闪开(即左上,右上,左下)
假如我们从左上角开始赶车:有666个车要被赶走,王走到右下角(即把车赶光)要998步,太多了;
那么如果王在最中间呢?——最少的一个方向最多也就166个,也就是王在中间背对车个数最少的方向走最少也可以赶走500个车,而王走到最底下只要499步——有2个车来不及闪开了
所以我们先把王移到正中间,再背对车个数最少的方向逼近就行了
活生生打成了码农题(200多行,有很多函数是多余的),一直说越界(其实电脑骗人,只要wronganswer就说越界),加了很多特判,结果发现把王的位置也读入的时候mp赋值为1了
代码:
#include<bits/stdc++.h> using namespace std; const int inf=200000000; int dx[]={-1,-1,1,1}; int dy[]={-1,1,-1,1}; struct node{ int x,y; }a[667]; int mp[1020][1020]; void init() { memset(mp,0,sizeof(mp)); for(int i=0;i<=666;i++) { scanf("%d%d",&a[i].x,&a[i].y); if (i) mp[a[i].x][a[i].y]++;//之前没判i!=0 } } void print() { printf("%d %d\n",a[0].x,a[0].y); fflush(stdout); } void up() { a[0].x--; print(); } void down() { a[0].x++; print(); } void left() { a[0].y--; print(); } void right() { a[0].y++; print(); } void leftup() { if(mp[a[0].x-1][a[0].y-1]) { up(); return; } a[0].x--; a[0].y--; print(); } void leftdown() { if(mp[a[0].x+1][a[0].y-1]) { down(); return; } a[0].x++; a[0].y--; print(); } void rightdown() { if(mp[a[0].x+1][a[0].y+1]) { down(); return; } a[0].x++; a[0].y++; print(); } void rightup() { if(mp[a[0].x-1][a[0].y+1]) { up(); return; } a[0].x--; a[0].y++; print(); } void read() { int id,xx,yy; scanf("%d%d%d",&id,&xx,&yy); if(id==-1) { exit(0); } mp[a[id].x][a[id].y]--; a[id].x=xx; a[id].y=yy; mp[a[id].x][a[id].y]++; } void ready() { while(a[0].x<500) { down(); read(); } while(a[0].x>500) { up(); read(); } while(a[0].y>500) { left(); read(); } while(a[0].y<500) { right(); read(); } } int dir,minn=inf,tmp; void judge_direction() { int cnt[4]={0,0,0,0};//0:leftup 1:rightup 2:leftdown 3:rightdown for(int i=1;i<=999;i++) { for(int j=1;j<=999;j++) { if(i<500) { if(j<500) cnt[0]+=mp[i][j]; if(j>500) cnt[1]+=mp[i][j]; } if(i>500) { if(j<500) cnt[2]+=mp[i][j]; if(j>500) cnt[3]+=mp[i][j]; } } } for(int i=0;i<4;i++) { if(minn>cnt[i]) minn=cnt[i],tmp=i; } dir=3-tmp; } void move(int dir) { if(dir==0) leftup(); else if(dir==1) rightup(); else if(dir==2) leftdown(); else rightdown(); } void solve() { while(1) { move(dir); read(); } } int main() { init(); ready(); judge_direction(); solve(); return 0; }
codeforces 1100D-Dasha and Chess
标签:and its 码农 i++ memset using cli 多行 lan
原文地址:https://www.cnblogs.com/Forever-666/p/11235148.html