栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ccf:201412 - 02 Z字型扫描 (解题思路 + 满分代码)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ccf:201412 - 02 Z字型扫描 (解题思路 + 满分代码)

题目描述


解题思路

方法一:铁头模拟题目中那个路线的规律,记录上一步是怎么走的,判断下一步该如何走(例如:上一步是横,下一步是左上或右下;上一步是左下,下一步是左下或下或横)用if判断下一步该如何走,这种方法我试过,可解,只是稍微有些繁琐
方法二:寻找更一般的规律
以4 x 4的矩阵为例

    首先将矩阵左边和下面补充等大矩阵不看题目中横的和向下的路线,就会发现其实就是在走对角线的格子,而且只有两种走法,一种左下,一种右上

所以得到的解法是,用一个标记flag标记当前的走法,当判断越界时,进行x = 0 / y = 0 进行调整 并更换走法,并且只有当该点在黑方格区域内才将该点输出,当走到(n, n)时结束


代码实现
#include 
#include 
#include 

using namespace std;

const int N = 510;

int n;
int a[N][N];

int main()
{
    cin >> n;
    
    for (int i = 1; i <= n; i ++)
    {
        for (int j = 1; j <= n; j ++)
        {
            cin >> a[i][j];
        }
    }
    
    int x = 1, y = 1;
    
    bool flag = true; // flag 为true表示右上
    while(x != n || y != n) //当遍历到a[n][n]时结束循环
    {
        if(x >= 1 && x <= n && y >= 1 && y <= n) 当该点在区域内
        {
            cout << a[x][y] << " ";
        }
        
        if(flag) //右上走法
        {
            x --; y ++;
        } 
        else 
        {
            x ++; y --;
        }
        
        if(x < 1) //边界为 1~n;当x < 1时越界
        {
            x = 1;
            flag = !flag;
        }
        if(y < 1)
        {
            y = 1;
            flag = !flag;
        }
    }
    cout << a[n][n]; //跳出循环后,输出最后一个数字
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715407.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号