[1424] 金克拉与贪吃蛇的故事
来源:互联网 发布:大连保险网络大学答案 编辑:程序博客网 时间:2024/04/27 21:18
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 4011010010110
- 样例输出
2
#include <iostream>#include <cstring>#include <cstdio>using namespace std;#pragma warning(disable : 4996)#define MAX 105char 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 105char 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 105char 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;}
- [1424] 金克拉与贪吃蛇的故事
- 一克拉的眼泪
- 一克拉的眼泪
- 管理故事216之020-贪吃与性命
- 都是风格化金克拉都是的风纪扣
- 蛇与乌龟的故事
- 鸣人的查克拉
- 简单的贪吃蛇
- 我的贪吃蛇
- canvas的贪吃蛇
- 贪吃蛇的制作
- 简单的贪吃蛇
- 贪吃蛇的游戏
- 贪吃蛇的一生
- 贪吃蛇的学习
- “丑陋”的贪吃蛇
- 贪吃蛇的想法
- 小小的贪吃蛇
- 正六面体染色 正六面体用4种颜色染色。共有多少种不同的染色样式?要考虑六面体可以任意旋转、翻转。
- 二叉树的遍历非递归形式
- J2SE——多态的浅析
- 我的Android进阶之旅------>Android之进度条(ProgressBar)的功能和用法
- AC自动机算法与AC自动机专辑
- [1424] 金克拉与贪吃蛇的故事
- 制作debian安装盘
- php乱码问题如何解决
- m个字符的n个字符排列
- php memcache使用
- 致辞(self)
- [Virus Management System][开发日记][0]
- hdu2546-饭卡
- N个数里面找出最大的k个数