codeforces 1100D-Dasha and Chess
Posted forever-666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1100D-Dasha and Chess相关的知识,希望对你有一定的参考价值。
传送门: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的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 1100F Ivan and Burgers