算法奥秘之数组实现开灯问题、蛇形填数

来源:互联网 发布:安装的软件 编辑:程序博客网 时间:2024/04/29 13:04

哈哈哈,时隔n个月,今天看了刘汝佳老师的《算法入门经典》,感觉厉害了,忍不住想要分享给大家,于是再次打开寄几小小的博客

学c语言也有一段时间了,逐渐发现,算法才是语言的精髓!于是拿起小本本,开始探索,今天是第一篇,以后或许还有下集哈哈哈


question1:开灯问题

有n盏灯,编号为1~n。第一人把所有灯打开,第二个人按下所有编号为2倍数开关的灯(这些灯将被关掉),第三个人按下所有编号为3倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推,一共有K个人,问最后有哪些灯开着?

#include<stdio.h>#include<string.h>#define maxn 1010int a[maxn];int main(){int n,k,first=1;memset(a,0,sizeof(a));  //作用把数组清零scanf("%d%d",&n,&k);for(int i=1;i<=k;i++)   for(int j=1;j<=n;j++)       if(j%i==0)a[j]=!a[j];  //这是点睛之处,为作者疯狂打call,取反for(int i=1;i<=n;i++)    if(a[i]){if(first)first=0;else printf("");printf("%d",i);}printf("\n");return 0;}
get到那个超炫酷的点没,震撼第二幕!


question2:蛇形填数

10  11  12  1

9    16  13  2

8    15  14  3

7    6    5    4

#include<stdio.h>#include<string.h>#define maxn 20int a[maxn][maxn];int main(){int n,x,y,tot=0;scanf("%d",&n);memset(a,0,sizeof(a));tot=a[x=0][y=n-1]=1;while(tot<n*n){while(x+1<n && !a[x+1][y]) a[++x][y]=++tot;while(y-1>=0 && !a[x][y-1]) a[x][--y]=++tot;while(x-1>=0 && !a[x-1][y]) a[--x][y]=++tot;while(y+1<n && !a[x][y+1]) a[x][++y]=++tot;}                                          //神奇!二维矩阵移动轨迹:下下下左左左上上上右右下下左上···for(x=0;x<n;x++){   for(y=0;y<n;y++)printf("%3d",a[x][y]);printf("\n");}return 0;}

好啦~有没有和我一样觉得非常厉害,哈哈哈,是的!神逻辑一般存在的算法值得更多的探索,有趣有趣,下期见