您的位置:首页 > 其它

2017百度之星初赛A-1006(HDU-6113)

2017-08-14 22:50 288 查看
思路:在图的外面包一圈'0'字符,然后dfs统计'0'字符的个数和'1'字符的个数。结果如下(num0表示0字符的个数,num1表示1字符的个数):

num0 == 1 && num1 == 1 : 结果为1

num0 == 2 && num1 == 1 : 结果为0

else 结果为-1

这个方法非常巧妙,可惜比赛时没想出来,直接在原图上dfs然后WA了一发后,发现有很多特殊的样例,如:

(1)

00100
00100
00100
00100
(2)
11111
10001
11111
10001
11111
直接dfs的话,不好判断1字符串块里面是否包含有且仅有一个0字符串块。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n, m;
int amt0, amt1;
char mat[105][105];
bool vis[2][105][105];
const int dirs[][2] = {{ -1, 0}, {1, 0}, {0, -1}, {0, 1}};

void dfs(int x, int y, char c) {
vis[c == '0' ? 0 : 1][x][y] = true;
for(int i = 0; i < 4; ++i) {
int nx = x + dirs[i][0], ny = y + dirs[i][1];
if(nx >= 0 && nx <= n + 1 && ny >= 0 && ny <= m + 1 && !vis[c == '0' ? 0 : 1][nx][ny] && mat[nx][ny] == c)dfs(nx, ny, c);
}
}

int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif // ONLINE_JUDGE
while(~scanf("%d%d", &n, &m)) {
for(int i = 1; i <= n; ++i)scanf("%s", mat[i] + 1);
for(int r = 0;r <= n + 1;r++)mat[r][0] = mat[r][m + 1] = '0';
for(int c = 0;c <= m + 1;c++)mat[0][c] = mat[n + 1][c] = '0';
memset(vis, 0, sizeof(vis));
amt0 = 0, amt1 = 0;
for(int i = 0; i <= n + 1; ++i) {
for(int j = 0; j <= m + 1; ++j) {
if(!vis[1][i][j] && mat[i][j] == '1') {
amt1++;
dfs(i, j, '1');
}
if(!vis[0][i][j] && mat[i][j] == '0') {
amt0++;
dfs(i, j, '0');
}
}
}

if(amt0 == 1 && amt1 == 1)printf("1\n");
else if(amt0 == 2 && amt1 == 1)printf("0\n");
else printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: