蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提!
Hello 大家好啊!我们今天讲一下8月13号AtCoder 264比赛的C题——Matrix Reducing!
=========================================================================
目录
题目
原题:
难度:
题目翻译:
本题意思是给我们两个矩阵,问删除第一个矩阵的行和列,能否得到第二个矩阵?
思路
这道题可以化成A矩阵中是否有B矩阵!所以,我们一行一行横着比较,判断是否按B数组横着的顺序,以及数字是否相同!注意:横着比较完一定还要竖着比较!!!竖着比较的时候只需把双重for循环交换一下位置!
横着:
for(int i=0;i<h;i++){
yy=0;
for(int j=0;j<w;j++) if(asl[i][j]==bsl[xx][yy]) yy++;
if(yy==ww) xx++,cnt++;
}
竖着:
for(int i=0;i<w;i++){
xx=0;
for(int j=0;j<h;j++) if(asl[j][i]==bsl[xx][yy]) xx++;
if(xx==hh) yy++,cnt++;
}
不难看出来横着时是i<h j<w,而竖着的时候却是i<w j<h!
代码
#include<bits/stdc++.h>
using namespace std;
int asl[11][11],bsl[11][11];//asl就是原本的矩阵,bsl就是想要的到的矩阵
int main(){
int h,w,hh,ww,xx,yy,cnt;
string tmp;
cin>>h>>w;
for(int i=0;i<h;i++) for(int j=0;j<w;j++) cin>>asl[i][j];
cin>>hh>>ww;
for(int i=0;i<hh;i++) for(int j=0;j<ww;j++) cin>>bsl[i][j];
if(hh>h or ww>w){//如果B矩阵比A矩阵大,那么便不可能!
cout<<"No";
return 0;
}
else{
//横着比较!
xx=0,yy=0,cnt=0;
for(int i=0;i<h;i++){
yy=0;
for(int j=0;j<w;j++) if(asl[i][j]==bsl[xx][yy]) yy++;
if(yy==ww) xx++,cnt++;//如果到头了xx++,也说明这一列可以,所以cnt++。
}
if(cnt!=hh){//判断是否是否是那么多行
cout<<"No";
return 0;
}
//竖着比较!
xx=0;
yy=0;
cnt=0;
for(int i=0;i<w;i++){
xx=0;
for(int j=0;j<h;j++) if(asl[j][i]==bsl[xx][yy]) xx++;
if(xx==hh) yy++,cnt++;//这时判断的是竖着是否到底
}
if(cnt!=ww){
cout<<"No";
return 0;
}
//如果都可以输出Yes!
cout<<"Yes";
}
return 0;
}
本题解就到这里了!喜欢的点个赞谢谢!