刷题日记—数组—数组偏移

好久没好好刷基础题了,今天接着刷了数组类型,碰到了一个数组偏移问题,如下:
image
题解:

#include<iostream>
using namespace std;
bool fire[10000][10000];
int main(){    //要注意数组越界问题
    int n,m,k;
    cin>>n>>m>>k;
    while(m--){
      int cx,cy;
      cin>>cx>>cy;
        cx+=2;  //从i=3开始遍历  进行数组的偏移,防止,1,2的时候数组越界访问,之后遍历统计数量的时候也要从i=3的时候开始遍历
        cy+=2;
        for(int i=cx-2;i<cx+3;++i){
            fire[i][cy]=true;
        }
         for(int i=cy-2;i<cy+3;++i){
            fire[cx][i]=true;
        
        }  
        fire[cx+1][cy+1]=true,fire[cx-1][cy+1]=true;
        fire[cx-1][cy-1]=true,fire[cx+1][cy-1]=true;
      }  //火把放置完毕
    while(k--){
        int dx,dy;
        cin>>dx>>dy;
        dx+=2,dy+=2;
        for(int i=dx-2;i<dx+3;++i){
            for(int j=dy-2;j<dy+3;++j){
                fire[i][j]=true;
            }
        }
        



        
    }
int cnt=0;
    for(int i=3;i<=n+2;++i){
        for(int j=3;j<=n+2;++j){
            if(!fire[i][j]){
                cnt++;
            }
        }
    }
            
        
        cout<<cnt<<endl;
    
                 
   return 0;
}

数组偏移的核心思想就是先把数组向右偏移k个,防止之后再遍历的时候下标越界,如1,2等情况;最后遍历统计结果的时候,n也要+k。

posted @ 2025-11-11 22:29  MaoS1mple  阅读(3)  评论(0)    收藏  举报