第五集 想了很久,还是决定去见你

第五集 想了很久,还是决定去见你

TimeLimit:5000ms  MemoryLimit:128000KB
64-bit integer IO format:%lld
Problem Description

     “你是我的小呀小苹果,点亮生命的火,火火火,这是我的滑板鞋,摩擦摩擦……”小A被一阵手机铃声吵醒了。可是他躺床上不想动,不想接,他猜测除了他的基友要他帮忙拿快递之外应该是没人会打电话给他了吧。

    过了一段时间铃声终于不响了,小A本能地拿起手机来看看时间。“是小C!”小A顿时清醒了过来,连忙起身,清了清嗓子,拨了回去。
    可是电话没人接,又连续打了好几次电话还是没人接。他懊悔极了,想刚才要是接了就好,想是不是她出了什么事,想是不是她想答应了,想难道遇到什么不测了打来求救电话,想……越想越不安,但却不能停止不想。
    于是他发了条短信“下午2点我在湖边等你,不见不散!”,于是他起床洗漱后去了湖边等待。
    春雨绵绵的季节好不容易有一丝放晴,微弱的阳光蒸发着坑坑洼洼的水使人感觉清凉,微风使水面泛起一阵阵涟漪,小A呆呆地坐在湖边的石板凳上望着湖水,不知道在思索着什么,难道有一道题没有AC吗?
    小A看了看手表3点了,心想是不是小C没有看到短信,便再发了一条继续等待下去。
    过来许久,下起了蒙蒙细雨,但是小A还是继续坐着,显然这点小雨是不会熄灭心中的火热。天渐渐暗了下来,小A想可能她不会来了就有点想走,但是他说过不见不散的,万一她来了怎么办。还是继续等下去,虽然他肚子饿,但是他还是不愿离开,虽然他想万一今天不会来,他还是决定等到明天。
    大概晚上八点左右,小C还是出现了,带了一份盒饭,和一袋东西。看着小A,小C心里突然感觉很温暖,这是她从来没有体会过的。小A太高兴了竟莫名留下了眼泪,不知道说什么才好。
    “还没吃饭吧,赶紧吃了吧!”说着把盒饭递给了小A。“我不饿,看到你就饱了!”边说边接来饭盒打开吃起来。
    “你今天怎么了?为何打我电话就再也打不通了?”小A疑惑问到。“突然有急事啦,没带手机~”小C敷衍回答。
    “我真的不明白,为何你不接受我?”小A鼓起勇气问。“从小我父母就感情不和,后面就慢慢有了家庭暴力,突然有一天我爸杀了我妈,然后自杀了,我好害怕,所以我不相信爱情。”小C伤感地说。
    “别怕,有我在!”小A想安慰她。“有你在更怕!”小C说着笑了起来。
    “咦,你袋子里面装的是什么呢?”小A问道。“没有,就两张图片。”“什么图片?能不能看下?”“可以啊,这是博物馆拍的,一张是罗马帝国分裂前的,一张是罗马帝国分裂成东西两帝国的”。
    “你也喜欢历史?”小A因发现与小C的兴趣一样很开心。
    小A看着照片,路灯略显昏暗。“罗马帝国分裂前后变化很大,但肯定有些东西是一样的吧。”小A蛮有兴趣地边看边说。“是呀,你可以编个程序来看看有哪些地方是一样的呀!”小C提议。
    广告时间:“一想就知道”提醒你,剧中罗马地图可以简化成O和1表示的矩阵,长宽不会超过1000,一样的区域就是连通的0所围成的区域位置和形状是一模一样的,所谓连通,是指某个点和与他相邻的四个点,即(x,y)点和(x-1,y)、(x+1,y)、(x,y-1)、(x,y+1)这4个点是连通的,如果点a和点b连通,b和c也是连通的,则a、b、c是属于同一个连通的区域的,看看能发现多少处一样的。做法一想就知道,不用我啰嗦了!
    不一会儿小A就编好了程序,把两张图拍照输入程序,果然就发现几处一样的地方。
    小C似乎比小A更加激动,连忙夺过电脑,详细地看,突然说“我发现了…”
Input

 输入有多组测试数据

每组测试数据的第一行是两个数n,m表示这两张地图的高度和宽度(1<=n,m<=1000)
接下来的n行是第一张图,每行是m个字符
再n行是第二张图
每张图的内容是0或1
 
Output

 每个测试数据输出一个整数表示答案

SampleInput
2 2
11
10
11
10
2 2
11
10
01
10
2 2
00
01
00
01
SampleOutput
1
1
1

这题就是典型的深搜问题。
题意: 给两幅图, 其中同样是 连通 且 形状相同, 才算一个。
思路就是, 通过函数栈, 达到历遍所有可能点, 若不存在可能点, 就返回。
时间复杂度是 O( m*n );
需要注意 是 在连通的 情况下, 形状还得完全相同。
比如:
0101    0101
1010    0101
1010    0101
这两幅图, 没有相同的部分。 自己好好参悟。
这步, 是自己卡到了。
code:
#include <cstdio>
using namespace std;
const int all = 3000;
char m1[ all ][ all ], m2[ all ][ all ];
int mover[ 4 ] = { -1, 0, 1, 0 };
int movec[ 4 ] = { 0, 1, 0, -1 };
int n, m, ans;
void dfs( int r, int c );
bool istrue;
int main(void)
{
    while( scanf( "%d%d", &n, &m ) != EOF ){
        for( int i=0; i < n; ++ i ){
            getchar();
            for( int j=0; j < m; ++ j ){
                m1[i][j] = getchar();
            }
        }

        for( int i=0; i < n; ++ i ){
            getchar();
            for( int j=0; j < m; ++ j ){
                m2[i][j] = getchar();
            }
        }

        ans = 0;
        for( int i=0; i < n; ++ i ){
            for( int j=0; j < m; ++ j ){
                istrue = true;
                if( !( m1[i][j] == m2[i][j] && m1[i][j] == '0' ) ){
                    istrue = false;
                }
                dfs( i, j );
                if( istrue ){
                    ++ ans;
                }
            }
        }

        printf( "%d\n", ans );
    }

    return 0;
}

void dfs( int r, int c )
{
    if( m1[r][c] == '0' || m2[r][c] == '0' ){
        if( m1[r][c] != m2[r][c] ){
            istrue = false;
        }

        m1[r][c] = m2[r][c] = '1';
        int x_, y_;
        for( int i=0; i < 4; ++ i ){
            x_ = mover[i] + r;
            y_ = movec[i] + c;

            if( x_ < 0 || x_ >= n || y_ < 0 || y_ >= m ){
                continue;
            }

            dfs( x_, y_ );
        }
    }
}
View Code

 

posted @ 2016-03-27 14:07  假大空  阅读(233)  评论(0编辑  收藏  举报