没有完成每日10篇博客(题)的任务。
总的来说bfs和dfs难度有点大,状态好的话半个多小时能看懂一道有感悟的题。
3.29
初读题目,与之前做过的扫雷相似,打算用深搜,标记已经数过的field防止走回头路,统计共有几个块。
看过题解后,感觉新的地方有:第一次调用dfs的方式,搜完一整块区域后总数++(递归时递归八个方位)搜完一整块区域后继续遍历,直到找到下一个未搜的区域,再开始调用dfs。
初读题目,思路:从起始点开始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
关于map的实战。该题主要用了map值和key一一对应的特点(map<key,value>),对于重复出现的字符串进行m[str]++的操作,实现字符串相同元素存入同一key中的操作,对map[key]即map的值进行递增。(map的下标操作:将key作为下标去执行查找,并返回相应的值)。
m.size()返回key的个数(注意区分m.size()和sizeof() )
若有选手未输过则yes,否则no。利用map无重复的特性,输的人赋值0,赢的人赋值1,输过一次的人即使再赢值仍然是0,最后遍历map,判断是否只有一个1。
总结而言,map的核心用法就是map[key]=value,实现去重等操作。