题解 | #回型矩阵#

回型矩阵

https://www.nowcoder.com/practice/36d5dfddc22c4f5b88a5b2a9de7db343

#include <iostream>
using namespace std;

int main() {
    int a;
    while (cin >> a) { // 注意 while 处理多个 case
        int m[21][21]={0};
        int b=1,i=0,j=0;
        int direction[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
        int directionindex = 0;
        // 0 右 1 下 2 左 3上
        while(b<=a*a)
        {
            m[i][j]=b++;
            // 开始放下一个位置了
            int i_next = i + direction[directionindex][0];
            int j_next = j + direction[directionindex][1];
            // directionindex 代表上下左右
            if(i_next<0 || i_next>=a || j_next>=a || j_next<0 || m[i_next][j_next]!=0)
            {
                directionindex = (directionindex+1)%4;
                i_next = i + direction[directionindex][0];
                j_next = j + direction[directionindex][1];
            }
            i = i_next;
            j = j_next;
        }
        for(int i=0;i<a;i++)
        {
            for(int j=0;j<a;j++)
            {
                cout<<m[i][j]<<" ";
            }
            cout<<endl;
        }
    }
}
// 64 位输出请用 printf("%lld")

像这种题目 最合适的方法还是一个数字一个数字的放 再去判断放的位置 是否是合法的

全部评论

相关推荐

后端转测开第一人:双非本 没大厂实习 后端肯定没机会了 直接转测开吧
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务