根據1或0計算對應的翻轉和旋轉次數
最後只需要做多翻轉一次,最多旋轉三次
但就是計算次數的部分很容易錯
(翻轉過奇數次的旋轉要反著轉)
所以0要分成兩種0
一種是沒翻過的0
另一種是翻過的0叫做o好了
010會等於1
因為實際上是01o
0o可以抵銷
只有1再依照題目翻轉一次即可
因此01001000101
實際上是01o o 10001o 1
可以約掉等於0
再依照題目逆轉回去即可
會這樣做是因為我覺得每次都翻轉還要用stack感覺很麻煩www雖然我這樣好像更複雜(?
我的AC在下面反白:)
#include <bits/stdc++.h>
using namespace std;
int main(){
int i,j,mx,my,x,y,n,tt=0,st=0,m;
cin>>mx>>my>>m;
int a[mx][my];
for(i=0;i<mx;i++)for(j=0;j<my;j++)cin>>a[i][j];
for(i=0;i<m;i++)
{
cin>>n;
if(n==1)
{
st++;
tt=tt+2;
}
if(n==0)
{
if(st%2==0)tt++;
if(st%2==1)tt=tt+3;
}
}
int k;
if(st%2==1)for(i=0;i<mx;i++)for(j=0;j<my/2;j++)
{
k=a[i][j];
a[i][j]=a[i][my-j-1];
a[i][my-j-1]=k;
}
int ans[my][mx]={0};
if(tt%4>0)for(i=0;i<mx;i++)for(j=0;j<my;j++)ans[my-j-1][i]=a[i][j];
if(tt%4>1)for(i=0;i<my;i++)for(j=0;j<mx;j++)a[mx-j-1][i]=ans[i][j];
if(tt%4>2)for(i=0;i<mx;i++)for(j=0;j<my;j++)ans[my-j-1][i]=a[i][j];
if(tt%2==0)
{
cout<<mx<<" "<<my<<endl;
for(i=0;i<mx;i++)
{
for(j=0;j<my;j++)
{
cout<<a[i][j];
if(j<my-1)cout<<" ";
}
cout<<endl;
}}
if(tt%2==1)
{
cout<<my<<" "<<mx<<endl;
for(i=0;i<my;i++)
{
for(j=0;j<mx;j++)
{
cout<<ans[i][j];
if(j<mx-1)cout<<" ";
}
cout<<endl;
}}
return 0;
}