2021年广东工业大学第11届腾讯杯新生程序设计竞赛(同步赛)D 机器人

Source

链接:https://ac.nowcoder.com/acm/contest/24803/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述
题目背景:
ZYL最近迷上了机器人,看着机器人在赛道上跑来跑去,ZYL陷入了思考…
题目描述:
现在,操场上有n×n个机器人组成的方阵,每个机器人都有自己独一无二的编号i``(1≤i≤n×n)
现在,机器人教官想让他们排整齐,即第i行第j列的机器人编号恰好等于(i−1)×n+j,但教官只能发出一种指令。
指令的内容:
让方阵最外周的机器人顺时针走动一位。
例如(教官喊了一次指令):

在这里插入图片描述

教官可以发出这个指令任意次,请问教官能否让机器人方阵排整齐?
若能,输出YES,否则,输出NO

输入描述:
输入的第一行包含一个正整数n(1≤n≤10),代表这是一个n×n的方阵
接下来n行,每行包含n个整数aij(1≤aij≤n*n)代表原方阵中第i行第j列的机器人的编号

输出描述:
输出共一行,YESNO.
示例1
输入

2
1 2
3 4

输出

YES

示例2
输入

2
1 2
4 3

输出

NO

AC 代码(比赛时所写,代码存在优化空间)

#include<iostream>
using namespace std;
int a[17][17];
int n;

void turn(){
    
      
    int b[17][17];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            b[i][j]=a[i][j];
            
    for(int i=2;i<=n;i++)
        a[1][i]=b[1][i-1];
    for(int i=2;i<=n;i++)
        a[i][n]=b[i-1][n];
    for(int i=n-1;i>=1;i--)
        a[n][i]=b[n][i+1];
    for(int i=n-1;i>=1;i--)
        a[i][1]=b[i+1][1];
}


bool judge(){
    
      
    int f=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i][j]!=(i-1)*n+j)f=1;
    if(f==0)return true;
    else return false;
}

int main(){
    
      
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    int n2=4*n;
    while(n2--){
    
      
        if(judge()){
    
      
            cout<<"YES";
            return 0;
        }
        turn();
    }
    cout<<"NO";
    return 0;
}