2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem K. KMC Attacks 交互题 暴力

本文介绍了一个名为KMC Attacks的问题,这是一个在CodeForces平台上发布的互动型编程挑战。任务要求玩家在一个N×M的网格中通过一系列扫描操作来定位并摧毁一个由科学界派出的研究单元。文章提供了详细的解决方案,包括如何根据接收到的信号更新搜索范围以及如何通过不断缩小可能性来最终确定目标位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem K. KMC Attacks

题目连接:

http://codeforces.com/gym/100714

Description

Warrant VI is a remote planet located in the Koprulu Sector. Warrant VI features a strange huge field,
which was discovered by the Kel-Morian Combine (KMC). The KMC is involved into a conflict with the
Scientific Community, which wishes to study the field, but the KMC intends to hold on to the significant
mineral wealth located there.
The field is represented by a rectangle of size N × M cells. All coordinates are positive integers. The left
upper corner is located at (1, 1) and the right bottom corner is at (N, M). The Scientific Community
have sent a T-280 unit to the field. You are one of the KMC members, your task is to find the unit
and destroy it. You have an orbital base equipped with a scanner at your disposal. You can examine
any single cell and if scan reveals the unit, a detachment is sent to destroy it. After every scan the unit
changes its location (i, j) by moving into one of four (three if the unit is in a border cell or two if it is in
a corner cell) adjacent cells. The unit has a tracking device. For every unit’s move you receive a signal:
‘U’ (for up, i decreases by one), ‘D’ (for down, i increases by one), ‘L’ (for left, j decreases by one), or ‘R’
(for right, j increases by one).
Time is running out so you are allowed to make not greater than 50000 scans to reveal the T-280 location.
Although the initial position of the unit is unknown, each its move provides you with information. You
are forbidden to scan cells, which definitely cannot hold the unit according to the gathered information.

Input

This is an interactive problem. Your program should first read a line with two integers N and M from
the standard input (where N is the height and M is the width of the field, 1 ≤ N, M ≤ 200). Then, for
every scan your program should print a corresponding request to the standard output (see below) and
read a reply from the standard input. Each reply is placed in a separate line and is either ’U’, ’D’, ’L’, ’R’
(meaning that you have missed and the unit has moved in the given direction) or ’DETECTED’ (meaning
that your last scan has revealed the unit’s position).

Output

For each scan print its coordinates i, j in a separate line (where i is the row number and j is the column
number). You have to flush the standard output after printing each request.

Sample Input

1 2
L
DETECTED

Sample Output

1 1
1 1

Hint

题意

交互题,在nm的矩阵,然后你需要找到一个东西。

每次你可以输入一个i,j位置,然后这个东西如果被抓到了,会返回delete,否则就会输出这个东西往哪儿走了。

题解:

暴力枚举这个东西的起点,然后判断现在的路径在哪儿,然后这样一直判断就好了。

注意,中途出界的点也得删去。

代码

#include <bits/stdc++.h>
#define rep(a,b,c) for(int (a)=(b);(a)<=(c);++(a))
#define drep(a,b,c) for(int (a)=(b);(a)>=(c);--(a))
#define pb push_back
#define mp make_pair
#define sf scanf
#define pf printf
#define two(x) (1<<(x))
#define clr(x,y) memset((x),(y),sizeof((x)))
#define dbg(x) cout << #x << "=" << x << endl;
const int mod = 1e9 + 7;
int mul(int x,int y){return 1LL*x*y%mod;}
int qpow(int x , int y){int res=1;while(y){if(y&1) res=mul(res,x) ; y>>=1 ; x=mul(x,x);} return res;}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
using namespace std;
list < pair < int , int > > s;
char buffer[2048];
list < int > test;
int dx  , dy , upx , downx , ly , ry , N , M;

bool judge( pair < int , int > p ){
    int x = p.first , y = p.second;
    if( x - upx <= 0 ) return false;
    if( x + downx > N ) return false;
    if( y + ry > M ) return false;
    if( y - ly <= 0 ) return false;
    return true;
}

int main(int argc,char *argv[]){
    scanf("%d%d",&N,&M);
    for(int i = 1 ; i <= N ; ++ i) for(int j = 1 ; j <= M ; ++ j) s.push_back( mp(i , j) );
    int ok = 0;
    for(int i = 1 ; i <= 50000 ; ++ i){
        while( !judge( s.front() ) ) s.pop_front();
        printf("%d %d\n" , s.front().first + dx , s.front().second + dy );
        s.pop_front();
        fflush( stdout );
        sf("%s",buffer);
        int len = strlen(buffer);
        if( len > 1 ){
            ok = 1;
            break;
        }else{
            char c = buffer[0];
            if( c == 'U' ){
                -- dx;
                upx = max( upx , - dx );
            }else if( c == 'D' ){
                ++ dx;
                downx = max( downx ,  dx );
            }else if( c == 'L' ){
                -- dy;
                ly = max( ly , -dy );
            }else{
                ++ dy;
                ry = max( ry , dy );
            }
        }
    }
    assert( ok == 1 );
    return 0;
}

转载于:https://www.cnblogs.com/qscqesze/p/5752332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值