4 条题解

  • 1
    @ 2025-6-12 22:02:02

    set,vector都可以 暂时存走了哪些点都可以都可 然后把走过的点赋值上ans if(jz[x][y]==0)判断走没走过优化避免重复计算值 其他的就是vector用法

    #include<bits/stdc++.h>
    #define ll long long 
    using namespace std;
    ll n,m,ans;
    char a[1005][1005];
    bool pd[1005][1005]; 
    ll jz[1005][1005];
    vector<pair<ll,ll>>b;
    void dfs(int x,int y,char syg)
    {
    	if(jz[x][y]!=0||pd[x][y]==true|| x<1||x>n|| y<1||y>n|| syg==a[x][y])
    		return;
    	pd[x][y]=true;
    	ans++;
      b.push_back(make_pair(x,y));
    	dfs(x+1,y,a[x][y]); 
    	dfs(x-1,y,a[x][y]); 
    	dfs(x,y+1,a[x][y]); 
    	dfs(x,y-1,a[x][y]);
    	return; 
    } 
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cin>>n>>m;;
    	for(int i=1;i<=n;i++)
    	   for(int j=1;j<=n;j++)
    		   cin>>a[i][j];
    	while(m--)
    	{
    		ll x,y;
    		cin>>x>>y;
    		if(jz[x][y]==0)
    		{
    		  dfs(x,y,'a');
          for (auto&i:b)
            jz[i.first][i.second]=ans;
          b.clear();
          ans=0;
    		}
    	  printf("%lld\n",jz[x][y]);
    	 } 
    	 return 0;
    }
    
    
    • @ 2025-6-12 22:14:32

      比并查集快,还见简单 orz

  • 0
    @ 2025-12-13 9:36:05

    洪水填充板子题:bfs+区域标记

    int dx[4] = { 0,0,-1,1 };
    int dy[4] = { 1,-1,0,0 };
    
    void solveA() {
    	int t = 1;
    	et(t) {
    		int n, m; cin >> n >> m;
    		vector<vector<int>>matrix(n + 1, vector<int>(n + 1));
    		for (int i = 1; i <= n; i++) {
    			string str; cin >> str;
    			for (int j = 1; j <= n; j++) {
    				matrix[i][j] = str[j - 1] + '0';
    			}
    
    		}
    
    		int cnt = 1;
    		unordered_map<int, int>hash;
    		vector<vector<int>>mask(n + 1, vector<int>(n + 1,0));
    		for (int i = 1; i <= n; i++) {
    			for (int j = 1; j <= n; j++) {
    				if (mask[i][j] == 0) {
    					queue<pair<int,int>>q;
    					int num = 1;
    					q.push({ i,j });
    					mask[i][j] = cnt;
    					
    					while (!q.empty()) {
    						int top_i = q.front().first;
    						int top_j = q.front().second;
    						q.pop();
    
    						for (int dic = 0; dic < 4; dic++) {
    							int ni = top_i + dy[dic];
    							int nj = top_j + dx[dic];
    
    							if (ni >= 1 && ni <= n && nj >= 1 && nj <= n&&mask[ni][nj]==0) {
    								if (matrix[top_i][top_j] != matrix[ni][nj]) {
    									q.push({ ni,nj });
    									mask[ni][nj] = cnt;
    									num++;
    								}
    							}
    						}
    					}
    					hash[cnt] = num;
    					cnt++;
    				}
    			}
    		}
    
    		for (int i = 0; i < m; i++) {
    			int ni, nj; cin >> ni >> nj;
    			cout << hash[mask[ni][nj]] << endl;
    		}
    	}
    }
    
    
    • 0
      @ 2025-11-28 8:41:01

      BFS

      ll n,m;
      const ll Max1=1005;
      char t[Max1][Max1];
      ll pd[Max1][Max1];
      ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
      
      void bfs(ll x,ll y)
      {
        ll ans=1;
        vector<pair<ll,ll>>jyh;
        queue<pair<ll,ll>>dl;
        dl.push(make_pair(x,y));
        jyh.push_back(make_pair(x,y));
        pd[x][y]=1;
        while(!(dl.empty()))
        {
        	ll x1,y1;
        	x1=dl.front().first,y1=dl.front().second;
        	dl.pop();
        	for(int i=0;i<4;i++)
          {
            if(((x1+dx[i]>=1&&x1+dx[i]<=n)&&(y1+dy[i]>=1&&y1+dy[i]<=n))&&t[x1][y1]!=t[x1+dx[i]][y1+dy[i]]&&pd[x1+dx[i]][y1+dy[i]]==0)
            {
              ans++;
              dl.push(make_pair(x1+dx[i],y1+dy[i]));
              jyh.push_back(make_pair(x1+dx[i],y1+dy[i]));
              pd[x1+dx[i]][y1+dy[i]]=1;
            }
          }
        }
        for(auto i:jyh)
        	pd[i.first][i.second]=ans;
        return ;
      }
      int main() 
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>n>>m;
          for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
              cin>>t[i][j];
          while(m--)
          {
            ll x,y;
            cin>>x>>y;
            if(pd[x][y]==0)
              bfs(x,y);
            cout<<pd[x][y]<<'\n';
          }
          return 0;
      } 
      
      
      • -1
        @ 2025-6-12 21:30:17
        #include<bits/stdc++.h>
        using namespace std;
        typedef long long ll;
        const int N = 1010;
        int n,m,ans,sum[1010100];
        char mp[N][N];
        bool vis[N][N];
        int dx[] = {0,0,1,-1},dy[] = {1,-1,0,0};
        int f[1010100];
        int find(int p)
        {
        	if(p!=f[p]) f[p] = find(f[p]);
        	return f[p];
        }
        void dfs(int x,int y)
        {	
        	if(ans == n*n) return;
        	for(int i=0;i<4;i++)
        	{
        		int tx = x+dx[i],ty = y+dy[i];
        		if(tx<=0||tx>n||ty<=0||ty>n) continue;
        		if(vis[tx][ty]) continue;
        		if(mp[tx][ty] == mp[x][y]) continue;
        		vis[tx][ty] = 1;
        		f[(tx-1)*n+ty] = find((x-1)*n+y);
        		ans ++;
        		dfs(tx,ty);
        	}
        	return;
        }
        int main()
        {
        	ios::sync_with_stdio(false);
        	cin.tie(0),cout.tie(0);
        	
        	cin>>n>>m;
        	for(int i = 1;i<=n;i++)
        	{
        		string s;
        		cin>>s;
        		for(int j = 0;j<n;j++)
        		{
        			mp[i][j+1] = s[j];
        		}
        	}	
        	for(int i = 1;i<=n;i++)
        	{
        		for(int j = 1;j<=n;j++)
        		{
        			int idx = (i-1)*n+j;
        			f[idx] = idx;
        		}
        	}
        	for(int i = 1;i<=m;i++)
        	{
        		int x,y;
        		ans = 1;
        		cin>>x>>y;
        		if(sum[find((x-1)*n+y)]) cout<<sum[find((x-1)*n+y)]<<endl;
        		else
        		{
        			vis[x][y] = 1;
        			ans = 1;
        			dfs(x,y);
        			sum[(x-1)*n+y] = ans;
        			cout<<ans<<endl;
        		}
        		
        	}
        	return 0;
        }
        

        dfs+并查集优化((())))

        • 1

        信息

        ID
        1095
        时间
        1000ms
        内存
        256MiB
        难度
        9
        标签
        递交数
        93
        已通过
        8
        上传者