[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;
}



原文地址:https://www.cnblogs.com/lgh1992314/p/5835104.html