Ryen的学习笔记

成长有多少新奇的美,就有多少撕裂的痛;离去有多么辽阔的自由,就有多么无边的孤寂。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

算法练习二(基本数据结构)

Posted on 2010-01-18 20:21  Ryen_lee  阅读(529)  评论(0)    收藏  举报

 

  • "Accordian" Patience :  链表,一遍过,可以考虑使用数组链表。
  • The Blocks Problem :使用数组,堆栈。 局部变量使用太滥,导致同步问题。
  • Parentheses Balance:直接使用堆栈即可。 注意fgets最后含有’\n’。 输出最好写在一起.

 

代码
for(int j = 0; j < len; j++)
{
if(buffer[j] == '(')
stack[
++top] = '(';
if(buffer[j] == '[')
stack[
++top] = '[';
if(')' == buffer[j])
if(top >= 0 && '(' == stack[top])
{
top
--;
}
else
{
printf(
"No\n");
ok
= 0;
break;
}
if(']' == buffer[j])
if(top >= 0 && '[' == stack[top])
{
top
--;
}
else
{
printf(
"No\n");
ok
= 0;
break;
}
}
if(ok && -1 == top)
printf(
"Yes\n");
if(ok && -1 != top)
printf(
"No\n");

 

 

  • Tree Summing: 二叉树的解析,注意递归的理解。 ungetc()函数的使用,isspace() 函数可以判断所有空白符,(空白符指空格、水平制表、垂直制表、换页、回车和换行符) 另外,关于getc函数可以看一下这篇文章
  • Quadtrees: 四叉数的构建。对递归理解不深致使一直WA,需要对递归详细分析下,构建递归生成式。 另外没有考虑到输入参数的大小导致 TLE,这说明如果题目没有明确说明输入规模时,自己要加以判断,不能盲目设定。
  • Tree(, 548): 该题就是使用递归构造树同时得出结果。 注意一些边界条件的判断(只有左子树,没有右子树)。另外还是注意将(==误写为=)。
  • S-Tree: 满二叉树的性质,没什么技术含量。不过POJ好像不能使用<math.h>,第一次提交出现编译错误。要注意的是,如果scanf和 fgets或者gets函数混用,需要注意scanf使用后,需要用 skip_line来清除后面的'\n',否则fgets 和 gets 函数会读错数据。
  • Evaluating Simple C Expressions: 算是编译原理基本问题,应该是一个二叉加法树模型,不过因为题目的输入限制条件很多,所以直接蛮力线性扫描结出。 在预处理过程中消除空格是个好的选择,字符串操作注意指针和下标的越界操作。贴一个消空格的代码:
space(char* str)
{
int i,k=0;
for(i=0;str[i];i++)
if(str[i]!=' ')
str[k
++]=str[i];
str[k]
=NULL;
return 0;
}
  • Knight Moves : 简单的BFS,不是0MS通过。
  • Oil Deposits : 简单的DFS,不是0MS通过。-6
  • The die is cast : DFS的变种, 注意对DFS的灵活使用,处理函数可以只有一个。 且注意如果需要排序的元素已知道,可以使用桶排序。(统计点数,总共只有1-6种情况)
  • Maze Exploration: 种子填充。 注意队列为空的判断 front < rear.  另外注意输入中一行含有空格时,不能用scanf读一行数据。gets函数不读入一行最后的'\n',但是会吃掉它。
  • Slash Maze: 不一般的DFS, 找到测试用例,调试了很多错误。思路不明确,致使递归问题很大, 开始使用递归导致栈溢出, 后来手动使用栈就TLE。 通过所有测试样例。 参考了比赛选手的答案,其中一对另辟蹊径,开始应该明确思路。 TLE的罪魁祸首是memset, 经过调试后发现,memset调用时如果数组太大,则非常耗时,vis[10000][100000] 在我本上要6秒左右, 最后将代码改为基于数组的状态转移。
scanf("%d %d "); //最后一个空格会吃掉最后一个整数后的所有空白符,很奇妙。

 

 

  • Dungeon Master: 简单的BFS。要注意的是,使用BFS时,需要用额外的空间来存储步长(如distance[]), 另外设置“访问过”标志位应该在该节点入队列前。
  • KTV(,11218): 直接三层循环AC, 忘记重置局部和sum导致WA(只重置了标志位),其实局部和sum完全不必要,可见变量越多,同步问题越复杂。