[CCF CSP]201412-2 Z字形扫描

这题是稍微复杂一点的小模拟,细节有点多(本人比较烦此类题目,耗时较久,算是偏难的CSP-2了

我采用的解决办法是,将方向表示为状态,(感觉这种方法比较适合这类题)

其次,画状态转移图(包含状态转移条件和执行语句,这一步需要细心

然后,根据状态转移图快速编写好程序

最后,验证样例和特殊数据(一开始写了bug,n为1时运行错误只得了90分,警惕

状态转移图:

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e2+10;
int x,y,n;
int a[N][N];
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>a[i][j];
    x=0;y=0;
    int f=1;
    while(x!=n-1||y!=n-1)
    {
        cout<<a[x][y]<<' ';
        if(f==1)
        {
            y++;
            if(x==0) f=3;
            if(x==n-1) f=2;
        }
        else if(f==2)
        {
            x--;y++;
            if(y==n-1) f=4;
            if(x==0&&y!=n-1) f=1;
            if(x!=0&&y!=n-1) f=2;
        }
        else if(f==3)
        {
            x++;y--;
            if(x==n-1) f=1;
            if(x!=n-1&&y!=0) f=3;
            if(x!=n-1&&y==0)f=4;
        }
        else if(f==4)
        {
            x++;
            if(y==0) f=2;
            if(y==n-1) f=3;
        }
    }
    cout<<a[x][y]<<endl;
    return 0;
}

如果大家有其他好的方法,欢迎提出和我探讨!~

原文地址:https://www.cnblogs.com/Andrew-aq/p/12488297.html