2 条题解

  • 0
    @ 2025-10-8 16:51:49
    #include<bits/stdc++.h>
    using namespace std;
    
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,1,-1};
    struct node{int x,y,t;};//x、y表示当前燃烧的位置,t表示当前位置开始燃烧的时间
    int a[1100][1100],s[1110000],n,m;
    //s数组是重点技巧,具体参考题目1670《幼儿园分糖果》的a数组。
    bool v[1100][1100];
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	memset(v,0,sizeof(v));
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]),v[i][j]=a[i][j];
    	int stx,sty;scanf("%d%d",&stx,&sty);if(a[stx][sty]==0)return 0;
    	memset(s,0,sizeof(s));s[1]++;s[1+a[stx][sty]]--;
    	
    	int maxt=a[stx][sty];//记录整个地图最后一根火柴燃烧结束的时间,一开始为出发格子的燃烧结束时间 
    	deque<node> Q;Q.push_back(node{stx,sty,1}); v[stx][sty]=0;
    	while(!Q.empty())
    	{
    		for(int i=0;i<=3;i++)
    		{
    			node no=Q.front();
    			no.x+=dx[i],no.y+=dy[i];
    			if(no.x>=1&&no.x<=n&&no.y>=1&&no.y<=m)
    			if(v[no.x][no.y]==1)
    			{
    				no.t++;
    				v[no.x][no.y]=0;
    				Q.push_back(no);
    				s[no.t]++;s[no.t+a[no.x][no.y]]--;
    				maxt=max(maxt,no.t+a[no.x][no.y]-1);
    			}
    		}
    		Q.pop_front();
    	}
    	for(int i=1;i<=maxt;i++)s[i]=s[i-1]+s[i],printf("%d\n",s[i]);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:51:40


      <br />
      

      #include<bits/stdc++.h>
      using namespace std;
      
      int dx[4]={-1,1,0,0};
      int dy[4]={0,0,1,-1};
      struct node{int x,y,t;};//x、y表示当前燃烧的位置,t表示当前位置开始燃烧的时间
      int a[1100][1100],s[1110000],n,m;
      //s数组是重点技巧,具体参考题目1670《幼儿园分糖果》的a数组。
      bool v[1100][1100];
      
      int main()
      {
      	scanf("%d%d",&n,&m);
      	memset(v,0,sizeof(v));
      	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]),v[i][j]=a[i][j];
      	int stx,sty;scanf("%d%d",&stx,&sty);if(a[stx][sty]==0)return 0;
      	memset(s,0,sizeof(s));s[1]++;s[1+a[stx][sty]]--;
      	
      	int maxt=a[stx][sty];//记录整个地图最后一根火柴燃烧结束的时间,一开始为出发格子的燃烧结束时间 
      	deque<node> Q;Q.push_back(node{stx,sty,1}); v[stx][sty]=0;
      	while(!Q.empty())
      	{
      		for(int i=0;i<=3;i++)
      		{
      			node no=Q.front();
      			no.x+=dx[i],no.y+=dy[i];
      			if(no.x>=1&&no.x<=n&&no.y>=1&&no.y<=m)
      			if(v[no.x][no.y]==1)
      			{
      				no.t++;
      				v[no.x][no.y]=0;
      				Q.push_back(no);
      				s[no.t]++;s[no.t+a[no.x][no.y]]--;
      				maxt=max(maxt,no.t+a[no.x][no.y]-1);
      			}
      		}
      		Q.pop_front();
      	}
      	for(int i=1;i<=maxt;i++)s[i]=s[i-1]+s[i],printf("%d\n",s[i]);
          return 0;
      }
      

      <br />
      

      <br />
      

      • 1

      *【宽搜(难度:6)】火柴人的末日

      信息

      ID
      699
      时间
      1000ms
      内存
      128MiB
      难度
      5
      标签
      递交数
      31
      已通过
      15
      上传者