“你是我的小呀小苹果,点亮生命的火,火火火,这是我的滑板鞋,摩擦摩擦……”小A被一阵手机铃声吵醒了。可是他躺床上不想动,不想接,他猜测除了他的基友要他帮忙拿快递之外应该是没人会打电话给他了吧。
输入有多组测试数据
每个测试数据输出一个整数表示答案
2 2 11 10 11 10 2 2 11 10 01 10 2 2 00 01 00 01
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_ ); } } }
原文:http://www.cnblogs.com/seana/p/5325534.html