链接: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列的机器人的编号
输出描述:
输出共一行,YES或NO.
示例1
输入
2 1 2 3 4
输出
YES
示例2
输入
2 1 2 4 3
输出
NO
AC 代码(比赛时所写,代码存在优化空间)
#includeusing 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; }



