zoukankan      html  css  js  c++  java
  • 洛谷 p1141 01迷宫题解

    很长时间没发博客了,今天水一下

    很多dalao说染色(普通的)过不了,

    我怎么就过了

    其实我也是今天才知道什么是染色(由@你听风在吼 dalao指导)

    然后自己打了一个,也不知道叫不叫染色,反正是过了

    QAQ

    这个类似连通块,我们把一整个连通块进行整体标记,每次不管访问哪一个成员,都可以直接输出已经存好的

    不多说废话,上代码

    #include<bits/stdc++.h>
    using namespace std;
    int b[1001][1001],c[1001];//b是标记哪个点是属于哪个染色区,c是每个染色区的连通块个数
    char a[1001][1001];//a是矩阵
    int xx[5] = {0,1,-1,0,0},yy[5] = {0,0,0,1,-1};
    int n,m,tot,ku = 1;//tot是统计连通块的,ku是染色区的"名称"
    void ss(int x,int y){
    	tot ++;
    	for(int i = 1;i <= 4;i++){
    		int x2 = x + xx[i],y2 = y + yy[i];
    		if(a[x][y] != a[x2][y2] && b[x2][y2] == 0 && x2 <= n && x2 > 0 && y2 <= n && y2 > 0 ){//这里要注意,染过的就不能再染了,想想为什么
    			b[x2][y2] = ku;//染色
    			ss(x2,y2);
    		}
    	}
    	return;
    }
    int main(int argc, char const *argv[])
    {
    	cin>>n>>m;
        for(int i = 1;i <= n;++i) scanf("%s",a[i]+1);
        for (int i = 1; i <= n; ++i)
        {
        	for(int j = 1;j <= n;++j){
        		if(b[i][j] == 0){
        			b[i][j] = ku;//起点也要染色
        			ss(i,j);
        			c[ku] = tot;
        			tot = 0;//清空
        			ku ++;//换一个连通块的名称
        		}
        	}
        }
        for(int i = 1;i <= m;i++)
    	{
    		int x,y;
    		scanf("%d%d",&x,&y);
    		cout<<c[b[x][y]]<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    PHP简单模拟登录功能实例分享
    一个form表单,多个提交按钮
    jquery validation验证身份证号、护照、电话号码、email
    MockMvc和Mockito之酷炫使用
    Java8 Stream API
    第一章 Lambda表达式
    Java中线程顺序执行
    单元测试之获取Spring下所有Bean
    iBatis之type
    json解析之jackson ObjectMapper
  • 原文地址:https://www.cnblogs.com/lztzs/p/11081894.html
Copyright © 2011-2022 走看看