【小英雄的車】

题目描述

在中国象棋中,車是最厉害的棋子了.能四个方向横冲直撞.小英雄有一个特殊的棋盘,它的尺寸是n行*m列的,可以把这个棋盘看作一个二维数组,它的左上角坐标是(0,0).棋盘上的0代表没有棋子,棋盘上的1代表有棋子.如果把一个車放在(x,y)位置,那么有哪些棋子能被車吃掉?
注意車是不能越过其他棋子来吃子的

输入格式

第一行会输入4个整数n,m,x,y
接着会输入一个n*m的矩阵.矩阵中只会有0和1
0<n,m,x,y<100

输入格式

输出若干行,每行是一个能被吃掉的棋子的坐标
如果没有棋子能被吃掉,输出NO
如果有超过1个棋子能被吃掉,按照字典序输出

样例输入/输出

输入数据 1

4 5 2 3
1 0 1 1 1
0 1 0 1 0
1 1 0 0 0
0 1 0 1 0

输出数据 1

1 3
2 1
3 3

 题解

题目要求判断在一个特殊棋盘上放置一个车(車)后,可以被吃掉的棋子的坐标。车可以在四个方向上横冲直撞,但不能越过其他棋子。

首先,我们需要读取输入,使用四个整数n,m,x,y表示棋盘的尺寸和车的坐标。接下来,我们读取一个n*m的矩阵来表示棋盘上的棋子分布,其中0代表没有棋子,1代表有棋子。

然后,我们需要按照车的四个方向进行遍历判断。首先从车的位置向上遍历,如果有棋子(即a[i][y]为1),就输出该棋子的坐标(i,y),并终止遍历。然后从车的位置向左遍历,如果有棋子(即a[x][i]为1),就输出该棋子的坐标(x,i),并终止遍历。然后从车的位置向右遍历,如果有棋子(即a[x][i]为1),就输出该棋子的坐标(x,i),并终止遍历。最后从车的位置向下遍历,如果有棋子(即a[i][y]为1),就输出该棋子的坐标(i,y),并终止遍历。

最后,我们需要注意如果没有棋子被吃掉,则输出"NO"。

C++代码实现如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,a[105][105];
int main(){
    cin>>n>>m>>x>>y;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>a[i][j];
        }
    }
    bool flag = false;
    for(int i=x-1;i>=0;i--){
       if(a[i][y]==1){
        cout<<i<<" "<<y<<"\n";
        flag = true;
        break;
       }
    }
    for(int i=y-1;i>=0;i--){
       if(a[x][i]==1){
        cout<<x<<" "<<i<<"\n";
        flag = true;
        break;
       }
    }
    for(int i=y+1;i<m;i++){
       if(a[x][i]==1){
        cout<<x<<" "<<i<<"\n";
        flag = true;
        break;
       }
    }
    for(int i=x+1;i<n;i++){
       if(a[i][y]==1){
        cout<<i<<" "<<y<<"\n";
        flag = true;
        break;
       }
    }
    if(!flag){
        cout<<"NO";
    }
    return 0;
}

时间复杂度分析:
假设棋盘的尺寸为n*m,车的坐标为(x, y)。
遍历车的四个方向,需要分别遍历n次(向上和向下)和m次(向左和向右),共需要遍历2*(n+m)次。
因此,代码的时间复杂度为O(n+m)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值