CodeForces 193A Cutting Figure

来源:互联网 发布:淘宝童装客服话术 编辑:程序博客网 时间:2024/05/22 01:37

题目大意:

给你一个矩阵,#代表染色,题目输入保证染色区域连通(如果两个区域有重边,说明连通)。问你最少去除多少个点。可以将染色区域分为两部分。如果没有这样的点,输出-1。

5 4#####..##..##..#####

这道题只要想到去除的点肯定小于等于2就很简单了,去找图的关键点即可。


代码如下:

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>using namespace std;int g_x,g_y;char map[55][55];int miv[55][55];int dfn[55][55];int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};int dfs(int x,int y,int pre,int dep){    int num=0;    miv[x][y]=dfn[x][y]=dep;    for(int i=0;i<4;i++)    {        if(i==3-pre||map[x+dir[i][0]][y+dir[i][1]]!='#') continue;                if(!dfn[x+dir[i][0]][y+dir[i][1]])        {            num++;            if(dfs(x+dir[i][0],y+dir[i][1],i,dep+1)) return 1;                        if(x==g_x&&y==g_y)            {                if(num>=2)                    return 1;            }            else if(dfn[x][y]<=miv[x+dir[i][0]][y+dir[i][1]])                return 1;            miv[x][y]=min(miv[x][y],miv[x+dir[i][0]][y+dir[i][1]]);        }        else        {            miv[x][y]=min(miv[x][y],dfn[x+dir[i][0]][y+dir[i][1]]);        }    }    return 0;}int main(){    int n,m,i,j;    int cnt=0;    //freopen("test.txt","r",stdin);    scanf("%d %d\n",&n,&m);    for(i=1;i<=n;i++)    {        gets(map[i]+1);        for(j=1;j<=m;j++)            if(map[i][j]=='#') cnt++,g_x=i,g_y=j;    }        if(cnt<=2) {puts("-1");return 0;}    if(dfs(g_x,g_y,4,1))        puts("1");    else puts("2");}


原创粉丝点击