嗜血魂K

导航

Sznoj

http://218.4.165.132/

这藐视是个给初小学生准备的..鉴于能力就那样,所以还是准备进去写写基础题,写写基础数据结构,usaco顺便写几题= =,无意发现有翻译的0 0

其实主要还是想练练语法百题的,因为自己语法的过度本来就是个很大问题.累了写写语法题罢.

1.switch用法:

switch(v){
  case 1:
  case 2: xxxx//可以这样在满足1,2条件下执行,暂时不知道怎么写更简单.
}



2.d003,合并同类项

自己形成思维定势了呢,老是想用栈写,这个代码也是网友给的= =

我的写了半天没写出来,思路比较复杂,所以抛弃了.其实他的也有些问题吧,如果数据大点呢,是会挂的= =

他的好处就是直接查找指数所在位置,但是数据一大,开不了更大数组就麻烦.

  
#include <stdio.h>
int b[404],a[202],mark[202];
int main(int argc, char *argv[])
{
char c;
int i,k,m,n;
m=n=0;
while(m<2){
n++;
scanf("%d%c",&b[n],&c);
if(c==10){
for(i=2;i<=n;i+=2){
//指数为i的系数为i-1
if((a[100+b[i]]=a[100+b[i]]+b[i-1]) != 0)
mark[100+b[i]]=1;
else mark[100+b[i]]=0;
}
n=0;
m++;
}
}
k=0;
for(i=200;i>0;i--){//输出系数
if(mark[i]){
printf(k?" %d %d":"%d %d",a[i],i-100);
k=1;
}
}
if(k==0) printf("0");//每一项都消除了也要输出 0 0
putchar('\n');
return 0;
}

 

4.模拟队列

各种错,回去修改

#include<stdio.h>
int stack[1000], n, first, top;
void Init_Stack()
{
scanf("%d", &n);
top = 0;
first = 0;
}
void Push_Stack()
{
int data;
scanf("%d", &data);
if(top-first == n) { printf("Full OV\n"); return; }//满了也要读入后面的数!
stack[top++] = data;
}
void Pop_Stack()
{
if(top - first == 0) { printf("Empty OV\n"); return; }
first++;
}
void Print_Stack()
{
if(top - first == 0) { printf("Empty\n"); return; }
while(first != top-1)
printf("%d ", stack[first++]);
printf("%d\n", stack[first++]);
}
int main(void)
{
freopen("c004.in", "r", stdin);
int com;
while(scanf("%d", &com) != EOF)
switch(com){
case 1: { Init_Stack(); break; }
case 2: { Push_Stack(); break; }
case 3: { Pop_Stack(); break; }
case 4: { Print_Stack(); break; }
}
return 0;
}



5.二叉树遍历

我只想说,瞎OJ,题目说明明明是用文件,搞得我stdo/i写好用fopen改写。。最后又改回去。。。。我怕freopen复测出问题  = =

#include<stdio.h>
#include<math.h>
#define MAXN 10000
int node[MAXN], n;
FILE *f1, *f2;
int _search(int data, int last)
{
int i;
for(i = 1; i <= last; i++)
if(data == node[i]) return 0;
return 1;
}
void PreOrder(int i)
{
if(i > n) return;
if(i == n) fprintf(f2, "%d\n", node[i]);
else fprintf(f2, "%d ", node[i]);
PreOrder(2*i);
PreOrder(2*i+1);
}

void InOrder(int i)
{
if(i > n) return;
InOrder(2*i);
if(i == n) fprintf(f2,"%d\n", node[i]);
else fprintf(f2, "%d ", node[i]);
InOrder(2*i+1);
}
void PosOrder(int i)
{
if(i > n) return;
PosOrder(2*i);
PosOrder(2*i+1);
if(i == 1) fprintf(f2,"%d\n", node[i]);
else fprintf(f2,"%d ", node[i]);
}
int main(void)
{
f1 = fopen("bintree.in", "rb");
f2 = fopen("bintree.out", "wb");
int h, p;
int i, data;
fscanf(f1, "%d%d", &h, &p);
for(i = 1, n = (int)(pow(2., (double)h)+5e-9)-1;i <= n;)
{
fscanf(f1, "%d", &data);
if(_search(data, i)) node[i++] = data;
}
switch(p)
{
case 1: PreOrder(1); break;
case 2: InOrder(1); break;
case 3: PosOrder(1); break;
}
fclose(f1);
fclose(f2);
return 0;
}


6.后序遍历

这段代码基本上是lrj的,我确实没理解透彻,下午再模拟下罢了,递归的就是吃力啊= =

#include<stdio.h>
#include<string.h>
#define MAXN 1000
void build(int n, char *s1, char *s2)
{
if(n <= 0) return;
int p = strchr(s2, s1[0])-s2;
build(p, s1+1, s2);
build(n-p-1, s1+p+1, s2+p+1);
printf("%c", s1[0]);
}
int main(void)
{
freopen("c006.in", "r", stdin);
char s1[MAXN], s2[MAXN];
int n;
scanf("%s%s", s1, s2);
n = strlen(s1);
build(n, s1, s2);
putchar('\n');
return 0;
}

posted on 2011-09-24 23:43  嗜血魂K  阅读(234)  评论(0)    收藏  举报