题目背景:
ZYL最近迷上了机器人,看着机器人在赛道上跑来跑去,ZYL陷入了思考......
题目描述:
现在,操场上有n×nn\times nn×n个机器人组成的方阵,每个机器人都有自己独一无二的编号i(1≤i≤n×n)i(1\le 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×nn\times 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列移一下,你会发现在移动的过程中有两个值会被覆盖,需特别注意,之后就好做啦,话不多说,上代码。
#include <bits/stdc++.h>
using 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" <<endl;
return 0;
}
y=a[1][n];
z=a[n][1];
for(i=1;i<=n;i++)
{
if(i==1)
{
for(k=n;k>=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<n;k++)
{
a[k-1][1]=a[k][1];
}
}
if(i==n)
{
for(k=n;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" <<endl;
return 0;
}
s=0;
}
cout << "NO" <<endl;
return 0;
}