机器人(广东竞赛)

题目背景:
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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值