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=;
int dx[]={-,-,,};
int dy[]={-,,-,};
struct node{
int x,y;
}a[];
int mp[][];
void init()
{
memset(mp,,sizeof(mp));
for(int i=;i<=;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[].x,a[].y);
fflush(stdout);
}
void up()
{
a[].x--;
print();
}
void down()
{
a[].x++;
print();
}
void left()
{
a[].y--;
print();
}
void right()
{
a[].y++;
print();
}
void leftup()
{
if(mp[a[].x-][a[].y-])
{
up();
return;
}
a[].x--; a[].y--;
print();
}
void leftdown()
{
if(mp[a[].x+][a[].y-])
{
down();
return;
}
a[].x++; a[].y--;
print();
}
void rightdown()
{
if(mp[a[].x+][a[].y+])
{
down();
return;
}
a[].x++; a[].y++;
print();
}
void rightup()
{
if(mp[a[].x-][a[].y+])
{
up();
return;
}
a[].x--; a[].y++;
print();
}
void read()
{
int id,xx,yy;
scanf("%d%d%d",&id,&xx,&yy);
if(id==-)
{
exit();
}
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[].x<)
{
down();
read();
}
while(a[].x>)
{
up();
read();
}
while(a[].y>)
{
left();
read();
}
while(a[].y<)
{
right();
read();
}
}
int dir,minn=inf,tmp;
void judge_direction()
{
int cnt[]={,,,};//0:leftup 1:rightup 2:leftdown 3:rightdown
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
if(i<)
{
if(j<) cnt[]+=mp[i][j];
if(j>) cnt[]+=mp[i][j];
}
if(i>)
{
if(j<) cnt[]+=mp[i][j];
if(j>) cnt[]+=mp[i][j];
}
}
}
for(int i=;i<;i++)
{
if(minn>cnt[i]) minn=cnt[i],tmp=i;
}
dir=-tmp;
}
void move(int dir)
{
if(dir==) leftup();
else if(dir==) rightup();
else if(dir==) leftdown();
else rightdown();
}
void solve()
{
while()
{
move(dir);
read();
}
}
int main()
{
init();
ready();
judge_direction();
solve();
return ;
}
codeforces 1100D-Dasha and Chess的更多相关文章
- CF1100D Dasha and Chess
题目地址:CF1100D Dasha and Chess 这是我的第一道交互题 思路不难,主要讲讲这条语句: fflush(stdout); stdout是标准输出的意思.因为有时候,我们输出到std ...
- D. Dasha and Chess(交互题)
题目链接:http://codeforces.com/contest/1100/problem/D 题目大意:给你一个999*999的图,然后有666个黑色旗子,一个白色棋子,每一次白色棋子只能在它附 ...
- codeforces 761D - Dasha and Very Difficult Problem
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces 761C Dasha and Password(枚举+贪心)
题目链接 Dasha and Password 题目保证一定有解. 考虑到最多只有两行的指针需要移动,那么直接预处理出该行移动到字母数字或特殊符号的最小花费. 然后O(N^3)枚举求最小值即可. 时间 ...
- Codeforces 761D Dasha and Very Difficult Problem(贪心)
题目链接 Dasha and Very Difficult Problem 求出ci的取值范围,按ci排名从小到大贪心即可. 需要注意的是,当当前的ci不满足在这个取值范围内的时候,判为无解. #in ...
- Codeforces 761E Dasha and Puzzle(构造)
题目链接 Dasha and Puzzle 对于无解的情况:若存在一个点入度大于4,那么直接判断无解. 从根结点出发(假设根结点的深度为0), 深度为0的节点到深度为1的节点的这些边长度为2^30, ...
- Codeforces 734D. Anton and Chess(模拟)
Anton likes to play chess. Also, he likes to do programming. That is why he decided to write the pro ...
- Codeforces 1173B Nauuo and Chess
题目链接:http://codeforces.com/problemset/problem/1173/B 思路参考:https://www.cnblogs.com/blowhail/p/1099123 ...
- codeforces 761B Dasha and friends
https://vjudge.net/problem/CodeForces-761B 题意: 有一个圆形跑道,上面有若干个障碍,分别给出两个人距离障碍的距离,问这两个人是否是在同一个跑道上跑步(我是这 ...
- @codeforces - 793G@ Oleg and chess
目录 @description - translation@ @solution@ @part - 1@ @part - 2@ @part - 3@ @part - 4@ @accepted code ...
随机推荐
- leetcood学习笔记-67-二进制求和
题目描述: 第一次提交: class Solution: def addBinary(self, a: str, b: str) -> str: list_a,list_b=[],[] for ...
- centos做免密登录
CentOS 6.9 SSH配置用户免密码登录 1. 演示环境: 192.168.1.144:CentOS 6.9 x86_64 192.168.1.146:CentOS 7.4 x86_64 2. ...
- [JZOJ 5818] 做运动
题意:带温度最短路. 思路: 我们将温度从小到大的将边加入,用并查集维护连通性. 如果一旦联通那么跑一遍\(spfa\)就可以得到答案. 复杂度\(O(m log m)\) #include < ...
- curl命令,curl实现post,curl监控网页shell脚本,curl多进程实现并控制进程数,
cURL > Docs > Tutorial: http://curl.haxx.se/docs/httpscripting.html 下载单个文件,默认将输出打印到标准输出中(STDO ...
- 19-MySQL-Ubuntu-数据表的查询-自关联(八)
自关联 转自:https://blog.csdn.net/hubingzhong/article/details/81277220
- 2019-2020 ICPC, NERC, Northern Eurasia Finals
A. Apprentice Learning Trajectory rdc乱编的做法 考虑贪心,每次会选择结束时间最早的. 设当前时间为 \(x\),那么可以区间有两类 a) \(l_i \leq x ...
- USACO2008 Roads Around The Farm /// queue oj23321
题目大意: N (1 ≤ N ≤ 1,000,000,000)牛群在遇到岔路时,若能分为恰好相差 K (1 ≤ K ≤ 1000)的两路,则持续分裂(假设会一直遇到岔路),否则停止开始吃草. Inpu ...
- kerberos协议介绍
一.kerberos认证过程: client向kerberos服务请求,希望获取访问server的权限.kerberos得到了这个消息,首先得判断client是否是可信赖的,也就是白名单黑名单的说法. ...
- 使用navicat 使用IP、用户名、密码直接连接linux服务器里面的数据库
一般新申请的服务器,没有开通3306端口的吧,反正我遇到的,要用Navicat去连接linux下的数据库,都必须填写两个地方的信息,才能链接成功. 如果想要只通过填写ip还有数据库用户名还有密码就可以 ...
- The linux command之高级键盘技巧
一.光标移动 二.修改文本 三.剪切和粘贴文本 四.使用历史命令