搜索题目练习

题目一(快速求和)

题目描述

给定一个数字字符串,用最小次数的加法让字符串等于一个给定的目标数字。每次加法就是在字符串的某个位置插入一个加号。在里面要的所有加号都插入后,就像做普通加法那样来求值。

例如,考虑字符串12,做 0 次加法,我们得到数字 12。如果插入 1 个加号,我们得到 3,因此,这个例子中,最少用 1 次加法就得到数字 3。

再举一例,考虑字符串303和目标数字 6,最佳方法不是3+0+3。而是3+03。能这样做是因为一个数的前导 0 不会改变它的大小。

输入格式

第一行:一个字符串 s。

第二行:一个整数 n。

输出格式

一行一个整数表示最少的加法次数让 s 等于 n。如果怎么做都不能让 s 等于 n ,则输出 −1。

输入输出样例

输入 #1复制

99999
45

输出 #1复制

4

说明/提示

数据规模与约定

对于 100%100% 的数据,保证 1≤len(s)≤40,1≤n≤105。

#include
using namespace std;
int asn = -1;
string s;
int n, res;
bool flag;
int k;
void dfs(int a, int b, int c, int d)
{
	if (c == n + 1) 
		return;
	if (d == 0)
	{
		int x = 0;
		for (int i = b; i <= n; ++i)
			x = x * 10 + s[i] - '0';
		if (a + x == res)
		{
			flag = true;
			asn = k;
		}
		return;
	}
	if (flag)	return;
	int x = 0;
	for (int i = b; i <= c; ++i)
		x = x * 10 + s[i] - '0';
	dfs(a + x, c + 1, c + 1, d - 1);
	dfs(a, b, c + 1, d);
}
int main()
{
	cin >> s;
	scanf("%d",&res);
	n = s.size() - 1;
	for (k = 0; k <= n; ++k)
	{
		if (flag)	break;
		dfs(0, 0, 0, k);
	}
    cout << asn << endl;
	return 0;
}

题目二(全球变暖)

题目描述

你有一张某海域 N×N 像素的照片,. 表示海洋、 # 表示陆地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......

其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

.......
.......
.......
.......
....#..
.......
.......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

输入格式

第一行包含一个整数 N。(1≤N≤1000)。

以下 N 行 N 列代表一张海域照片。

照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。

输出格式

一个整数表示答案。

输入输出样例

输入 #1复制

7 
.......
.##....
.##....
....##.
..####.
...###.
....... 

输出 #1复制

1

说明/提示

时限 1 秒, 256M。蓝桥杯 2018 年第九届省赛

怎么说嘞,这是我借鉴别人思路写的,但是搞了半天不知道自己错在哪里,只能另寻他法了。

不过这串代码的bool使用的很独特,平时没有见过,就放这里记录下来了。

错误代码(可以过样例):
#include
#include
//设地图变量
char a[1001][1001];
//设地图大小变量n,没有淹没的ans,方向数组
int n, ans, next[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
//v来记录返回值,vis数组打标记 
bool v, vis[1001][1001];
//判断是否是陆地 
bool daoy(int x, int y) {
	return a[x][y] != '.';
}
//dfs函数
bool dfs(int x, int y) {
	 vis[x][y] = 1;//遍历过了,vis标记为1
	//上下左右都是陆地,不沿海,那么这个岛不会被完全淹没 
	 if (daoy(x + 1, y) && daoy(x, y + 1) && daoy(x - 1, y) && daoy(x, y - 1))v=1;
	//扩张
	 int tx, ty;
	 for (int i = 0; i < 4; i++) {
		 tx = x + next[i][0];
		 ty = y + next[i][1];
		 if (tx < 0 || ty < 0 || tx < n - 1 || ty < n - 1)continue;
		 if (daoy(tx, ty) && vis[tx][ty] == 0)//没遍历过并且是陆地,那么此区域属于这片岛屿 
			 dfs(tx, ty);
	 }
	 a[x][y] == '.';
	 return v;
}

//主函数
int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++)scanf("%s", a[i]);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (daoy(i, j)) {
				v = 0; ans += dfs(i, j);
			}
		}
	}
	printf("%d", ans);
	return 0;
}



正确代码(太晚了,这道题我今天先欠着,明天补上)搜索题目练习_第1张图片

你可能感兴趣的:(算法)