阶段学习总结--搜索(2)

没有完成每日10篇博客(题)的任务。

总的来说bfs和dfs难度有点大,状态好的话半个多小时能看懂一道有感悟的题。

3.29

2386 -- Lake Counting

初读题目,与之前做过的扫雷相似,打算用深搜,标记已经数过的field防止走回头路,统计共有几个块。

看过题解后,感觉新的地方有:第一次调用dfs的方式,搜完一整块区域后总数++(递归时递归八个方位)搜完一整块区域后继续遍历,直到找到下一个未搜的区域,再开始调用dfs。

​​​​​​1979 -- Red and Black

初读题目,思路:从起始点开始dfs,每遇到一个符合条件的点则sum++,并标记防止重复计数。

看过题解后,由于题目需要判断字符,又需要矩阵式存储,所以用到了二维字符指针;无需额外开辟标记数组,把已计数的点作为墙处理即可(一开始理解错了题意,以为不能重复经过一个点)

突然明白了为啥字符数组指针一定要用new,跟不用数组而用vector是一个道理。

char[]---数组
char*=new char[]----vector

经过测试现阶段类与对象的题目,vector<char>不如char*new方便快捷,如复制和赋值时,vector<char>操作更繁琐。

//二维字符数组创建
char **p = new char *[y];
for (int i = 0; i < y; i++) *(p + i) = new char[x];
//二维数组删除
for (int i = 0; i < y; i++) delete[]p[i];
delete[]p;
p = NULL;

3.30

晚上读了三个题,全都没有完成。每次都有目前没学到的东西困扰,查找以后牵扯的东西很多,而且不是很常见,暂时放弃。

4.1

尝试了一下搜索,还是比较困难,关键代码经常读不懂,很难理解如何实现,比如位运算和模运算,这样继续看题解太难了,坚持不了,读题花费时间多,到最后关键代码看不懂,时间白白浪费掉了。

4.2

对于许多之前关注较少,但很常用的algorithm包含的函数及例题进行研究。

bool next_permutation(begin(),end())返回值是布尔类型,在函数内部实现元素交换,以实现全排列。


	int a[]={1,2,3,4,5,6,7,8,9};
	cin>>x;
	do 
	{
		for(i=0;i<x;i++)
			  cout<<a[i];
		cout<<endl;
	}while(next_permutation(a,a+x));

再看一下如何实现1-n中选m个数进行全排列。

cin >> n >> m;
string s1, s2;
for (i = 0; i < n; i++)
	s1 += '0' + i + 1;
cout << s1 << endl;
s2 = s1.substr(0, m);
cout << s2 << endl;
while (next_permutation(s1.begin(), s1.end())) 
{
	if (s2 != s1.substr(0, m))
	{
		s2 = s1.substr(0, m);
		cout << s2 << endl;
	}
}

总结:

1.字符,字符数组,字符串常用,+'0'的方式让其表示为ASCII码十进制的值(而不是ASCII码对应符号)。

2.next_permutation(begin,end)使用时作为判断条件,函数内部会实现对迭代器对象的元素互换至全排列遍历完成。

binary_search(arr[],  size  ,  val),数组首地址,元素个数,查找值。以二分法检索的方式查找,查找到则返回其下标,查找不到则返回false(大前提:有序)

与其类似的还有(参数列表相同)        

lower_bound(): 返回容器中第一个大于或等于val的元素的位置。

upper_bound(): 返回容器中第一个大于val的元素的位置。

由于其返回的是地址,可通过pos = lower_bound(a, a + n,val) - a;的形式得到pos,类似的形式还有如size=unique(a,a+n)-a

注意!:lower,upper若查找不到元素,返回的是末元素的下一位,数组越界,因此在程序中要避免访问,以免造成runtime error

Problem - 2072

关于map的实战。该题主要用了map值和key一一对应的特点(map<key,value>),对于重复出现的字符串进行m[str]++的操作,实现字符串相同元素存入同一key中的操作,对map[key]即map的值进行递增。(map的下标操作:将key作为下标去执行查找,并返回相应的值)。

m.size()返回key的个数(注意区分m.size()和sizeof() )

Problem - 2094

若有选手未输过则yes,否则no。利用map无重复的特性,输的人赋值0,赢的人赋值1,输过一次的人即使再赢值仍然是0,最后遍历map,判断是否只有一个1。

总结而言,map的核心用法就是map[key]=value,实现去重等操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值