题目背景:
ZYL最近迷上了机器人,看着机器人在赛道上跑来跑去,ZYL陷入了思考......
题目描述:
现在, *** 场上有n×nntimes nn×n个机器人组成的方阵,每个机器人都有自己独一无二的编号i(1≤i≤n×n)i(1le i le n times n)i(1≤i≤n×n)。
现在,机器人教官想让他们排整齐,即第iii行第jjj列的机器人编号恰好等于(i−1)×n+j(i-1) times n+j(i−1)×n+j,但教官只能发出一种指令。
指令的内容:
让方阵最外周的机器人顺时针走动一位。
例如(教官喊了一次指令):
教官可以发出这个指令任意次,请问教官能否让机器人方阵排整齐?
若能,输出YES,否则,输出NO
输入的第一行包含一个正整数n(1≤n≤10)n(1≤ n ≤10)n(1≤n≤10)------代表这是一个n×nntimes nn×n的方阵
接下来nnn行,每行包含nnn个整数ai,j(1≤ai,j≤n×n)a_{i,j}(1 le a_{i,j} le n times n)ai,j(1≤ai,j≤n×n)------代表原方阵中第iii行第jjj列的机器人的编号
输出描述:输出共一行,YES或NO.
示例1
输入复制2 1 2 3 4
2 1 2 3 4输出
复制YES
YES
示例2
输入复制2 1 2 4 3
2 1 2 4 3输出
复制NO
NO
这题的关键在于如何外围循环,我是先将第一行向右移,再将最后一行往左移,在第一列,第n列移一下,你会发现在移动的过程中有两个值会被覆盖,需特别注意,之后就好做啦,话不多说,上代码。
#includeusing namespace std; int main() { int n; cin >> n; int a[n+2][n+2]; int i,k,j; int x,y,z,m; for(i=1;i<=n;i++) { for(k=1;k<=n;k++) { cin >> a[i][k] ; } } int s=0; for(j=0;j<=n+1;j++) // 外围好像要循环至少n次 { for(i=1;i<=n;i++) { for(k=1;k<=n;k++) { if(a[i][k]!=(i-1)*n+k) // 判断初次输入的是否正确 {s=1; } } } if(s==0) { cout << "YES" < =1;k--) { a[1][k+1]=a[1][k]; } } if(i==n) { for(k=1;k<=n;k++) { a[n][k-1]=a[n][k]; } } } for(i=1;i<=n;i++) { if(i==1) { for(k=1;k 1;k--) { a[k+1][n]=a[k][n]; } } } a[2][n]=y; // 这就是被覆盖的值,再重新赋 a[n-1][1] =z; for(i=1;i<=n;i++) { for(k=1;k<=n;k++) { if(a[i][k]!=(i-1)*n+k) // 开始检测循环后的正确性 {s=1; } } } if(s==0) { cout << "YES" < 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)