Official

B - Rotate Editorial by PCTprobability


外側のマスがどのように動くかを考えると、以下の \(4\) 通りに場合分け出来ます。

  • \(1 \le i \le N-1\) を満たす整数 \(i\) に対して、マス \((1,i)\) に書かれている整数はマス \((1,i+1)\) に移動する。
  • \(1 \le i \le N-1\) を満たす整数 \(i\) に対して、マス \((i,N)\) に書かれている整数はマス \((i+1,N)\) に移動する。
  • \(2 \le i \le N\) を満たす整数 \(i\) に対して、マス \((N,i)\) に書かれている整数はマス \((N,i-1)\) に移動する。
  • \(2 \le i \le N\) を満たす整数 \(i\) に対して、マス \((i,1)\) に書かれている整数はマス \((i-1,1)\) に移動する。

よって、それぞれのマスが外側のマスかどうか判定し、外側のマスならば上記に従って動かし、そうでないならば動かさないことで操作後のマス目を求めることが出来ます。計算量は \(\mathrm{O}(N^2)\) です。

また、入力を受け取る際に int などの整数型で受け取ってしまうと 1011 のような \(1\) 列の入力を整数 \(1011\) として受け取ってしまうため、文字列型で受け取ってから \(1\) 文字ずつ分解するなどの工夫が必要です。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main(){
  int n;
  cin>>n;
  vector<vector<int>> a(n,vector<int>(n));
  for(int i=0;i<n;i++){
    string s;
    cin>>s;
    for(int j=0;j<n;j++){
      if(s[j]=='0') a[i][j]=0;
      else a[i][j]=1;
    }
  }
  vector<vector<int>> ans(n,vector<int>(n));
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      if(i==0||j==0||i==n-1||j==n-1){
        if(i==0&&j<n-1) ans[i][j+1]=a[i][j];
        if(i<n-1&&j==n-1) ans[i+1][j]=a[i][j];
        if(i==n-1&&j>0) ans[i][j-1]=a[i][j];
        if(i>0&&j==0) ans[i-1][j]=a[i][j];
      }
      else{
        ans[i][j]=a[i][j];
      }
    }
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++) cout<<ans[i][j];
    cout<<endl;
  }
}

posted:
last update: