题目描述
在中国象棋中,車是最厉害的棋子了.能四个方向横冲直撞.小英雄有一个特殊的棋盘,它的尺寸是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)。