2023-08-07力扣今日二题

链接:

剑指 Offer 29. 顺时针打印矩阵

题意:

如题

解:

麻烦的简单题,具体操作类似走地图,使用一个长度四的数组表示移动方向

我这边的思路是如果按正常的方向没有路走了,那转向下一个方向一定有路,不然就是最后一格了

所以每次就先找下一个位置,然后check函数判断是否合法(走过的设置为INT_MAX),合法的话输出自身然后移动到下一个位置,不合法的话就转向判断下一个位置是否合法,这时候如果转完还不合法,则退出

退出的时候最后一格还没有输出,所以输出一下

PS:之前我是用-1当标记的,结果卡了一组数据,换了INT_MAX然后AC了,不过出题没给范围,应该是包含整数范围的,也算是偷鸡了,不过用longlong配LLONG_MAX也是一样的,所以无所谓啦

实际代码:

#include
using namespace std;
typedef pair PII;
PII add(const PII& lhs,const PII& rhs)
{
    PII ret{0,0};
    ret.first=lhs.first+rhs.first;
    ret.second=lhs.second+rhs.second;
    return ret;
}
bool check(const PII& now,const int& lgr,const int& lgc,const vector>& matrixCopy)
{
    if(now.first<0||now.first>=lgr) return false;
    if(now.second<0||now.second>=lgc) return false;
    if(matrixCopy[now.first][now.second]==INT_MAX) return false;
    return true;
}
vector spiralOrder(vector>& matrix)
{
    vector ret;//答案 
    vector>matrixCopy(matrix);//拷贝原数组 
    int zt=0,moved=0;PII move[4]={ {0,1},{1,0},{0,-1},{-1,0}};//移动相关 
    int lgrow=matrix.size();if(!lgrow) return ret;//行数 
    int lgcol=matrix[0].size();if(!lgcol) return ret;//列数 
    PII start={0,0};//起点
    while(true)
    {
        PII next=add(start,move[zt]);
        //cout<<"next:"<> matrix;
    int n,m,temp;cin>>n>>m;
    for(int i=0;it;
        for(int j=0;j>temp;
            t.push_back(temp);
        }
        matrix.push_back(t);
    }
    vectorans=spiralOrder(matrix);
    for(auto &a:ans) cout<

限制:

  • 0 <= matrix.length <= 100
  • 0 <= matrix[i].length <= 100

你可能感兴趣的:(力扣每日一题,leetcode,c++)