codeforces 954C. Matrix Walk(思维模拟)

codeforces 954C. Matrix Walk(思维模拟)

http://codeforces.com/contest/954/problem/C

题意:

现在有一个大小为x*y的矩阵(x,y大小未知),然后规定A(i,j)的值为y*(i-1)+j,并且每次移动只能往四个方向移动。现在输入一个数n,然后输入n个数代表走过的轨迹a1,a2,….,an,问你能不能求出x,y如果能输出YES,并输出x和y,否则输出NO。

题解:

这题不难看出移动的跨度的值的绝对值不是1,就是y,一旦跨度比1大肯定就是y,然后我们就确定了y。但是我们确定了y不代表这个y就是对的(这里我wa了几次),因为有可能有其他跨度,或者走1的时候对于这个y来说是打斜走的。因此,得出y之后要进行第二次检查,跨度为1的两个点只能在同一行,我们可以用(a[i]+y-1)/y来确定在第几行,同理跨度为y只能在同一列,用a[i]%temp来确定第几列,这样就基本确定能不能找出来了。还有x是不用求的直接1e9就肯定满足了。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    int temp=1;
    int flag=0;
    for(int i=1;i<n;i++)
    {
        if(abs(a[i]-a[i-1])>1)
        {
                temp=abs(a[i]-a[i-1]);
                break;
        }
    }
    for(int i=1;i<n;i++)
    {
        if(abs(a[i]-a[i-1])==temp)
        {
            if((a[i]%temp)!=(a[i-1]%temp))
            {
                flag=1;
                break;
            }
        }
        else if(abs(a[i]-a[i-1])==1)
        {
            if((a[i]+temp-1)/temp!=(a[i-1]+temp-1)/temp)
            {
                flag=1;
                break;
            }
        }
        else
        {
            flag=1;
            break;
        }
    }
    if(flag)
    {
        cout<<"NO"<<endl;
    }
    else
    {
        cout<<"YES"<<endl;
        cout<<1000000000<<" "<<temp<<endl;
    }
 } 

posted on 2018-04-02 21:03  TRZNDP_Z  阅读(72)  评论(0编辑  收藏  举报

导航