1.length()函数用来取字符串的长度//可以辅助其他函数简化代码,比如reverse(),可以直接取字符串长度而不用计算字符长度
string sb="wangdayong";
sb.length()=10;
length是求字符串数组中字符串有几个
string []s={"王大勇","王发水"};
t=s.length;
cout<<t;
t=2;
2.宏定义 define 补充//可以简化步骤,比如在代码开头可以写#define pi 3.14此时代替了const 的作用
#define是宏定义命令
作用:替换,将字符串用宏名代替
不参数的使用:
#define wf 2//不加分号,此时wf=2
带参数的使用(此时可以实现复杂运算,可带公式):
#define wf(x) x+2;
int m=2;
m=wf(m);//此时m=4
注意:
#define Square(x) x*x
float temp = Square(3+3);
//程序的本意可能是要计算6*6=36,但由于宏定义执行的是直接替换,本身并不做计算,因此实际的结果为 3+3*3+3=15
//想要避免这个问题,只需要修改如下:
#define Square(x) ((x)*(x))
3.algorithm头文件下常用函数//用万能头文件
(1)max().min().abs()
max(x,y)返回x.y中的最大值;
也可返回x.y.z中的最大值
max(x,,max(y,z));
min(x,y)返回x,y中的最小值。
abs(x)返回x的绝对值,x必须为整数,浮点型需在math头文件下添加fabs
(2)swap()
sweap(x,y)用来交换x,y的值
int x=1,y=2;
sweap(x,y)//x=2,y=1;
(3)reverse()
用于数组指针的反转或迭代器的反转。[)范围是左闭右开
int a[10]={1,2,3,4,5,6,7,8,9,10};
reverse(a,a+4);//将a[0]到a[3]进行反转
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
输出结果:
4 3 2 1
也可以对string类型的字符串进行翻转
string a="abcd";
reverse(a.begin(),a.begin()+1);
运行结果:
bacd
4.fill()//将数组的某一段赋为数组类型对应范围的任意值
定义形式:
fill(数组起点元素地址;数组终点元素地址的下一个地址;每个元素所赋的值)
int a[5]={1,2,3,4,5};
fill(a,a+5,123)
for(int i=0;i<5;i++)
cout<<a[i]<<" ";
运行结果:
123 123 123 123 123
5.sort()//高效排序,可以根据改变比较函数随心所欲地进行排序
定义形式:
sort(首元素地址,尾元素地址的下一个地址,比较函数)
比较函数不是必填项
int s[5]={2,1,3,4,5};
sort(s,s+6);//将a[0]到a[5]从小到大拍列
输出结果:
1 2 3 4 5
含有比较函数的形式//根据自己需要添加,使程序按照自己的排序准则进行:
比如令其输入两位数按照个位数大小排序:
sort(起点,终点,cmp);
bool cmp(int x,int y){
return x % 10 > y % 10;
}
6.广度优先搜索
将每一层的所有节点都走一边,直到找到目标状态,它非常适宜于解决“最少”这种发问的问题,一般由队列实现,我在锻炼的过程中也有了一些感悟。
7.深度优先搜索
使用递归和栈实现。广度优先搜索在进入某一层时会先将该层节点完全比对完才会递归至下一层,而深度优先搜索则会在比对完一个节点后立即递归其子节点。就像横着切豆腐和竖着切豆腐一样。深度优先搜索就好比走迷宫, 不断顺着一条路走, 直到走不通为止, 然后回退到上一个路口再向另外的方向行走(走过的方向就不会再走了,又不是傻子, 知道走不通,还向走不通的方向走), 不断重复(试过所有路口, 状态转移), 重复直到找到唯一的一条合适的路径。
****************************************************************************************************
深度搜索例题
问题描述
GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。
Input
输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是’*’,代表没有油,要么是’@’,表示有油。
Output
对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。
Sample Input
1 1
*
3 5
@@*
@
@@*
1 8
@@*@
5 5
*@ @@@ @@
@@@@ @@*@
0 0
Sample Output
0
1
2
2
#include<bits/stdc++.h>
using namespace std;
int map[150][150];//用来记录该地是否被查询过,0代表没有
int x, y;
char p[150][150];//存放油田
int find(int a, int m, int n)
{
if (map[m][n] != 0|| p[m][n] != '@')
return 0;
else
{
map[m][n] = a;
//下面这些就是递归部分
find(a, m + 1, n);
find(a, m + 1, n + 1);
find(a, m + 1, n - 1);
find(a, m, n + 1);
find(a, m, n - 1);
find(a, m - 1, n + 1);
find(a, m - 1, n);
find(a, m - 1, n - 1);
}
return 0;
}
int oilPocket(int a)
{
int i, j;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
if (map[i][j] == 0 && p[i][j] == '@')
{
find(a, i, j);
a++;
}
}
}
return a;
}
int main()
{
int ans;
while (scanf("%d %d", &x, &y) != EOF)
{
if (x == 0 || y == 0) break;
memset(p, '*', sizeof(p));
for (int i = 0; i < x; i++)
{
cin.get();//存回车
for (int j = 0; j < y; j++)
{
scanf("%c", &p[i][j]);
}
}
memset(map, 0, sizeof(map));
ans = oilPocket(1) - 1;
printf("%d\n", ans);
}
return 0;
}