T4 旋转矩阵
题目描述
给出多组N*N矩阵,如果第一个矩阵能通过旋转0/90/180/270得到另一个矩阵,输出yes或者no
输入格式
输出格式
输入输出样例 #1
输入 #1
2
3
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
2
0 1
1 0
0 2
2 0
输出 #1
yes
no
#include<iostream>
#include<vector>
using namespace std;
bool areYouOk(vector<vector<int>> nowNum,vector<vector<int>> num2){ //判断矩阵相等
int n = nowNum.size(); //矩阵大小
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(nowNum[i][j] != num2[i][j]){
return false;
}
}
}
return true;
}
vector<vector<int>> rotateNum(vector<vector<int>> nowNum){
int n = nowNum.size();
vector<vector<int>> rotateNum(n,vector<int>(n));
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
rotateNum[j][n - i - 1] = nowNum[i][j];
}
}
return rotateNum;
}
bool isRotate(vector<vector<int>> num1,vector<vector<int>> num2){ //判断通过旋转得到另一个
vector<vector<int>> nowNum = num1;
for(int i = 0;i < 4;i++){
if(areYouOk(nowNum,num2)){ //判断矩阵相等
return true;
}
nowNum = rotateNum(nowNum); //旋转矩阵
}
return false;
}
int main(){
int T; //样例组数
cin >> T;
while(T--){
int n;
cin >> n; //矩阵大小
vector<vector<int>> num1(n,vector<int>(n)); //n行n列矩阵
vector<vector<int>> num2(n,vector<int>(n));
for(int i = 0;i < n;i++){ //第一个矩阵
for(int j = 0;j < n;j++){
cin >> num1[i][j];
}
}
for(int i = 0;i < n;i++){ //第二个矩阵
for(int j = 0;j < n;j++){
cin >> num2[i][j];
}
}
if(isRotate(num1,num2)){ //旋转判断
cout << "yes" << endl;
}else{
cout << "no" << endl;
}
}
return 0;
}
T5 旋转矩阵
题目描述
给出一排棋子,1是白色棋子,0是黑色棋子,每次只能从左边或者右边拿走棋子,
求最少拿走多少个棋子能实现还剩下x个白棋,反则输出-1;
输入格式
输出格式
输入输出样例 #1
输入 #1
8 2
0 1 0 1 1 0 0 1
输出 #1
3
#include<iostream>
using namespace std;
int minRemove(int n,int x,int chess[]){ //棋子总数,白棋目标数量,棋子序列
int sumWhite = 0; //清算序列当中白棋总数
for(int i = 0;i < n;i++){
if(chess[i] == 1){
sumWhite++;
}
}
if(sumWhite < x){ //总白棋小于目标白棋数
return - 1;
}
int ans = n; //拿掉棋子数量
int windowWhite = 0; //窗口内白棋数量
int left = 0,right = 0; //滑动窗口左右索引
while(right < n){
if(chess[right] == 1){
windowWhite++;
}
right++; //右索引向右移动
while(windowWhite > x){ //窗口内白棋数量大于目标数量的时候,移动左索引
if(chess[left] == 1){
windowWhite--;
}
left++;
}
if(windowWhite == x){ //找达到目标数量去除棋子的最小值
ans = min(ans,n - (right - left));
}
}
return ans;
}
int main(){
//黑白棋子
/*
经典算法:滑动窗口算法
*/
int n,x;
cin >> n >> x;
int chess[n + 1]; //棋子序列
for(int i = 0;i < n;i++){
cin >> chess[i];
}
int ans = minRemove(n,x,chess);
if(ans != -1){
cout << ans << endl;
}else{
cout << -1 << endl;
}
return 0;
}