[1424] 金克拉与贪吃蛇的故事
http://ac.nbutoj.com/Problem/view.xhtml?id=1424
-
[1424] 金克拉与贪吃蛇的故事
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
-
金克拉。金克拉,亩产一千八。。。——题目编号:1029(内附金克拉音乐一首)
最近Miku酱不种水果啦,因为水果不好赚钱啊。——题目编号:1140
所以就开始种起金克拉了。
贪吃蛇又来啦,最近也盯上了金克拉,是口味变了么还是说鸡鸭有禽流感不敢吃了?——题目编号:1098
Do you know Chihuo?——吃货专题(1200——1207)
这次,Miku酱找了一块 M * N 的农田,然后在里面种起了金克拉。
但是她知道这样子会被贪吃蛇全部吃掉的。所以除了金克拉,农田里还有Miku为了防止贪吃蛇吃掉农作物而造的泥土堆。但是Miku天性善良,不能让贪吃蛇饿死啊,所以就没有用泥土堆把所有金克拉都包围,而是随机的在农田里摆放泥土堆。这样子,大家都可以生存下去了酱酱酱酱~~~
- 输入
-
输入第一行包括两个正整数 M 和 N (1 <= M, N <= 100)。
接下来 M 行,每行 N 个数字,只包含 '0' 和 '1'。'0'代表这个位置种着农作物,'1'表示这个位置是泥土堆。 - 输出
-
输出能幸存下来的金克拉的数量。
- 样例输入
-
3 4 0110 1001 0110
- 样例输出
-
2
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#pragma warning(disable : 4996)
#define MAX 105
char map[MAX][MAX];
int n, m;
int ans;
bool flag;
const int moves[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(int x, int y)
{
if(x == 1 || x == n || y == 1 || y == m)
{
flag = false;
return;
}
ans++;
for(int i = 0; i < 4; i++)
{
int p = x + moves[i][0];
int q = y + moves[i][1];
if(p >= 1 && p <= n && q >= 1 && q <= m && map[p][q] == '0')
{
map[p][q] = '1';
dfs(p, q);
}
}
}
int main()
{
freopen("in.txt", "r", stdin);
int sum = 0;
while(cin >> n >> m)
{
sum = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> map[i][j];
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(map[i][j] == '0')
{
flag = true;
map[i][j] = '1';
ans = 0;
dfs(i, j);
if(flag)
{
sum += ans;
}
}
}
}
cout << sum << endl;
}
return 0;
}从第1、n行,第1、m列搜索。
改过的代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#pragma warning(disable : 4996)
#define MAX 105
char map[MAX][MAX];
int n, m;
int ans;
const int moves[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(int x, int y)
{
map[x][y] = '1';
ans++;
for(int i = 0; i < 4; i++)
{
int p = x + moves[i][0];
int q = y + moves[i][1];
if(p >= 1 && p <= n && q >= 1 && q <= m && map[p][q] == '0')
{
dfs(p, q);
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int sum = 0;
while(cin >> n >> m)
{
sum = 0;
ans = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> map[i][j];
if(map[i][j] == '0')
{
sum++;
}
}
}
for(int i = 1; i <= m; i++)
{
if(map[1][i] == '0')
{
dfs(1, i);
//cout << ans << endl;
}
if(map[n][i] == '0')
{
dfs(n, i);
//cout << ans << endl;
}
}
for(int j = 1; j <= n; j++)
{
if(map[j][1] == '0')
{
dfs(j, 1);
//cout << ans << endl;
}
if(map[j][m] == '0')
{
dfs(j, m);
//cout << ans << endl;
}
}
cout << sum - ans << endl;
}
return 0;
}
其实代码1,只要去掉递归的终止条件就可以AC的
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define MAX 105
char map[MAX][MAX];
int n, m;
int ans;
bool flag;
const int moves[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(int x, int y)
{
if(x == 1 || x == n || y == 1 || y == m)
{
flag = false;
//return;
}
ans++;
for(int i = 0; i < 4; i++)
{
int p = x + moves[i][0];
int q = y + moves[i][1];
if(p >= 1 && p <= n && q >= 1 && q <= m && map[p][q] == '0')
{
map[p][q] = '1';
dfs(p, q);
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int sum = 0;
while(cin >> n >> m)
{
sum = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> map[i][j];
}
}
for(int i = 2; i <= n- 1; i++)
{
for(int j = 2; j <= m - 1; j++)
{
if(map[i][j] == '0')
{
flag = true;
map[i][j] = '1';
ans = 0;
dfs(i, j);
if(flag)
{
sum += ans;
}
}
}
}
cout << sum << endl;
}
return 0;
}
Keep it simple!

浙公网安备 33010602011771号