万花筒算法笔记

文章目录
  1. 1. 想法来源
  2. 2. 效果
  3. 3. 具体代码
  4. 4. 扩展
  5. 5. 作用
  6. 6. 总结
  7. 7. 音乐

[原创,转载请附网址:http://dongshuyan.top]

想法来源

    前一段时间学习率计算智能,感觉非常神奇,同时也刷新了我对解决问题的方法论。(其实我是写了一篇文章的,不过还没写完,写完再传上来)。
新方法论其中一点就是我们可以从大自然中生活中寻找答案,看看我们遇到的问题能否建立自然模型,再仿照自然的方式来解决。
    我想到了很多,其中一个就是万花筒,感觉这个代码比较好写,就利用课余时间写出来试试玩玩,于是就有了下面的代码和效果。

效果

wanhuatong1                  wanhuatong2                 wanhuatong3                
wanhuatong4                       wanhuatong5

GIF录制软件不太好 所以效果有一些卡顿,其实卡顿是由于C++结果每次printf速度比较慢,录制GIF时,就录制到了printf一半的结果。

具体代码

    #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <string>
#include <map>
#include <queue>
#include <deque>
#include <cmath>
#include <math.h>
#include <vector>
#include <ctime>
#include <cctype>
#include <stack>
#include <set>
#include <bitset>
#include <functional>
#include <numeric>
#include <stdexcept>
#include <utility> 
using namespace std;
#define ll long long 
#define m0(a) memset(a, 0, sizeof(a))
#define m1(a) memset(a, -1, sizeof(a))
#define C1(x)  cout<<x<<endl;
#define C2(x,y)  cout<<x<<" "<<y<<endl;
#define C3(x,y,z)  cout<<x<<" "<<y<<" "<<z<<endl;
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define r() (rand()/(double)(RAND_MAX))
struct stu
{
    int x,y,z;
    bool operator < (const stu &b) const
    {
        return x<b.x;    
    }
};
const int inf = 0x3f3f3f3f; 
const double eps = 1e-15;
const double pi = acos((double)-1) ;
const int maxn = 1010;
const int N = 2;
const double R = 0.999;
const ll M = 1e9+7;
int i,j,k,l,m,n,x,y,z,ans,num;
string a[maxn][maxn];
int v[maxn]={0};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
string s[4]={"◢","◣","◥","◤"};


int ge (string cc)
{
    for (int i=0;i<4;i++)
        if (s[i]==cc) return i;
    return 0;
}
int ne(int x)
{
    if (x==0) return 0;
    if (x==1) return 2;
    if (x==2) return 1;
    if (x==3) return 3;

    return 0;
}

int nex(int x,int y)
{
    if (y==1)
    {
        if (x==0) return 1;
        if (x==1) return 0;
        if (x==2) return 3;
        if (x==3) return 2;
    }
    if (y==2)
    {
        if (x==0) return 3;
        if (x==1) return 2;
        if (x==2) return 1;
        if (x==3) return 0;
    }
    if (y==3)
    {
        if (x==0) return 2;
        if (x==1) return 3;
        if (x==2) return 0;
        if (x==3) return 1;
    }

}

void rot(int m)
{
    for (int i=1;i<=m;i++)
    {
        for (int j=1;j<=m;j++)
        {
            int nn= ge(a[i][j]);
            a[i][2*m+1-j]=s[nex(nn,1)];
            a[2*m+1-i][2*m+1-j]=s[nex(nn,2)];
            a[2*m+1-i][j]=s[nex(nn,3)];
        }
    }
}

void pr()
{
    /*
    for (int i=1;i<=(N)*n;i++)
    {
        for (int j=1;j<=(N)*n;j++)
        {
            cout<<a[i][j];
        }
        printf("\n");
    }
    printf("\n");printf("\n");

    */
    int p=n;
    for (int i=1;i<=N;i++) p=p*2;
    for (int i=1;i<=p;i++)
    {
        for (int j=1;j<=p;j++)
        {
            cout<<a[i][j];
        }
        printf("\n");
    }
    return;
}
int main () 
{
    srand((unsigned)time(NULL));
    #ifdef ONLINE_JUDGE

    #else

        //freopen("in.in","r",stdin);
        //freopen("in.out","w",stdout);

    #endif

    int cas;
    //scanf("%d",&n);
    n=3;
    for (int i=1;i<=n;i++)
    {
        for (int j=i;j<=n;j++)
        {
            int r=(int)(4*r());
            a[i][j]=s[r];
            a[j][i]=s[ne(r)];
        }
    }
    for (int i=1;i<=N;i++) rot(i*n);
    pr();

    while (1)
    {
        for (int i=1;i<=n;i++)
        {
            for (int j=i;j<=n;j++)
            {
                double r=r();
                if (r<R)
                {
                    int r=(int)(4*r());
                    a[i][j]=s[r];
                    a[j][i]=s[ne(r)];
                }
            }
        }
        for (int i=1;i<=N;i++) rot(i*n);
        int p;
        for (int ii=1;ii<=100000;ii++) 
            for (int jj=1;jj<=500;jj++)  p&=1; 
        system("cls");
        pr();
    }
    return 0;
}

扩展

    其实用C#把每个小块写成一个对象的话就会没有卡顿,还可以加上各种颜色,会更好看,也不难,就是略麻烦。  

作用

    我想了好久好像还真没啥用,万花筒有啥用呢?笑哭

总结

1.有想法就多实践,写出来还是很开心的
2.最好写一些有功能的算法呀笑哭

音乐