博弈论——组合游戏(Bash和nim)

2023-11-14

博弈论1

组合游戏

特征

  • 两个玩家
  • 一个状态集合
  • 游戏规则是指明玩家从一个状态可以移动到哪些状态
  • 玩家轮流进行移动
  • 如果当前处于的状态无法移动,则说明游戏结束
  • (大部分时候)无论玩家如何选择,游戏会在有限步操作内结束

通常的解题步骤

  • 首先设置两种状态P,N 态
    • P:走到这个状态的玩家(previous player)赢的状态
    • N:从这个状态走的玩家(next player)赢的状态
  • 确定终态是 P 还是 N
  • 从终态逆推打表找规律
  • 验证规律的正确性
  • 确定初态是 p 还是 N
    • 初态是 P 意味着先手输
    • 否则意味着先手赢

P N 态的性质

  • 至少能走到一个P态的状态是N态
  • 下一步只能走到N态的状态是P态

题目分析

bash游戏

只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜

枚举m,进行倒推打表
比如:

m = 1
0(P) <—— 1(N) <—— 2(P) <—— 3(N) .....
m = 2
0(P) <—— 1(N) <—— 2(N) <—— 3(P) .....
m = 3
0(P) <—— 1(N) <—— 2(N) <—— 3(N) <—— 4(P).....

然后我们可以初步的确定结论为
if(num % (m + 1) == 0) num 为 P 态
else num 为 N 态

最后可以去确定n的状态,判断先手是赢还是输

题目和代码
#include<iostream>
#include<algorithm>
using namespace std;

int t;

void solve()
{
    int n,k;
    cin >> n >> k;
    if(n % (k + 1)) puts("A");
    else puts("B");
}

int main()
{
    cin >> t;
    while(t --) solve();
    return 0;
}
eleting Divisors
  • 首先我们可以确定终态为质数,我们可以直接确定质数为P态
  • 从1开始从小到大确定每个数的状态
  • 根据PN性质,能到达P态的是N态,只能到达N态的是P态,然后打表找规律
  • 发现奇数全为P态
  • 偶数分为两种情况
    • 如果是2的整奇数次幂,那么为P态
    • 否则为N态
打表代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<vector>
#include<unordered_map>
using namespace std;

unordered_map<int,bool> mp;
vector<int> device;

void get(int x)
{
    for(int i = 2; i * i <= x; i ++)
        if(x % i == 0) 
        {
            device.push_back(i);
            device.push_back(x / i);
        }
}

int main()
{
    for(int i = 0; i <= 200; i++) 
    {
        device.clear();
        get(i);
        if(device.empty()) mp[i] = 1;
        else 
        {
            bool flag = true;
            for(int d : device)
                if(mp[i - d])
                {
                    flag = false;
                    break;
                }
            mp[i] = flag;
        }
    }
    fstream fstrm("output.txt");
    for(int i = 1; i <= 200; i++) fstrm << i << ' ' << (mp[i]? 'P':'N')  << endl;
    fstrm.close();
    return 0;
}

提交代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int t;

void solve()
{
    int n;
    cin >> n;
    if(n % 2) puts("Bob");
    else 
    {
        int cnt = 0,pos = -1;
        for(int i = 0; i < 32; i++)
            if(n >> i & 1)
            {
                cnt ++;
                if(cnt == 1) pos = i;
            }
        //cout << cnt << ' ' << pos << endl;
        if(cnt == 1 && pos & 1) puts("Bob");
        else puts("Alice");
    }
}

int main()
{
    cin >> t;
    while(t--) solve();
    return 0;
}
Digital Deletions
超时的思路
  • 我是直接确定终态""(空字符串)为P态,然后直接dfs加记忆化搜索,对每个状态递归倒推
  • 但是我代码超时了嘻嘻
超时代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;

unordered_map<string,bool> mp;
string s;
int n;

bool dfs(string x)
{
    // cout << x << endl;
    if(mp.count(x)) return mp[x];
    bool flag = true;
    for(int i = 0; i < x.size(); i++)
    {
        int y = x[i] - '0';
        if(!y)
        {
            if(dfs(x.substr(0,i))) flag = false;
        }
        else 
        {
            for(int j = 0; j < y; j++)
            {
                string z = x.substr(0,i);
                z += '0' + j;
                z += x.substr(i + 1);
                if(dfs(z)) flag = false;
            }
        }
    }
    return mp[x] = flag;
}

void solve()
{
    cin >> s;
    mp[""] = 1;
    dfs(s);
    if(mp[s]) puts("No");
    else puts("Yes");
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    while(t--) solve();
    return 0;
}
优化思路
  • 假设sg[x] = 1,表示x是N态,否则就是P态
  • 这个题很巧妙的地方在于我们完全可以根据为P状态的数,利用PN态的性质,倒退每一个P数字可以被一步到达的数的状态为N,不然一定为P状态;(优点类似于BFS搜索?)
  • 比如说 0 是 N 态,一步只能到达0的数字有 1,1 是 P 态,而 2 ~ 9 能都走到 1,2 ~ 9 是N态。
  • 还要注意的是,如果一个数的位数不超过六位,那它后面也可以通过填充0来一步到达这个数
  • 题目要求的数的位数小于7位,所以我们可以通过打表,直接预处理没有前导零的数的sg值,有前导零的可以直接得出答案
优化代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 1e6 + 10;
string s;
bool sg[N];
int pow[8];
int n,t;

int getlen(int x)
{
    int res = 0;
    while(x)
    {
        res ++;
        x /= 10;
    }
    return res;
}

int get_num()
{
    int res = 0;
    for(int i = 0; i < s.size(); i++)
        res = res * 10 + (s[i] - '0');
    return res;
}

void get_sg(int x)
{
    int l = getlen(x);
    for(int i = 0; i < l; i++)
    {
        int y = x;
        int tem = x / pow[i] % 10;
        for(int j = tem; j < 9; j++)
        {
            y += pow[i];
            sg[y] = 1;
        }
    }
    for(int i = 1; i + l <= 6; i++)
    {
        int y = x * pow[i];
        for(int j = 0; j < pow[i - 1]; j++) 
        {
            sg[y + j] = 1;
           // cout << y + j << ' ' << sg[y + j] << endl;
        }    
    }
}

void init()
{
    sg[0] = 1;
    pow[0] = 1;
    for(int i = 1; i < 8; i++) pow[i] = pow[i - 1] * 10;
    for(int i = 1; i < 1000000; i++) 
        if(!sg[i]) get_sg(i);
}

void solve()
{
    cin >> s;
    if(s[0] == '0') puts("Yes");
    else 
    {
        int x = get_num();
       // cout << x << endl;
        if(sg[x]) puts("Yes");
        else puts("No");
    }
}

int main()
{
    cin >> t;
    init();
    while(t--) solve();
    return 0;
}
Calendar Game

啊,其实这题和上一题得解题思路是一样的,不过又要比上一题麻烦很多

思路
  • 一样先确定终态的,然后由终态倒能被一步到达的状态;(一样利用PN态的性质咯)
  • 要注意的是,需要把数字转化为年份需要判断合法性
  • 倒退上一步状态时,也要保证上一步状态的合法性
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N = 21000000;
bool sg[N];
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int y,m,d;
int t;

int get_year(int x)
{
    return x / 10000;
}

int get_mon(int x)
{
    return x % 10000 /100;
}

int get_day(int x)
{
    return x % 100;
}

int get_num(int year,int mon,int day)
{
    return year * 10000 + mon * 100 + day;
}

bool check(int x)
{
    int year = get_year(x);
    int mon = get_mon(x);
    int day = get_day(x);
    if(!day || !mon) return false;
    if(mon > 12) return false;
    if(year % 400 == 0 || (year % 100 == 0 && year % 4)) 
    {
        if(mon == 2 && day > 29) return false;
        else if(day > a[mon]) return false;
    }
    else if(day > a[mon]) return false;
    return true;
}

void get_sg(int x)
{
    int year = get_year(x);
    int mon = get_mon(x);
    int day = get_day(x);
    if(mon == 1)
    {
        int b = get_num(year - 1,12,day);
        if(check(b)) sg[b] = true;
    }
    else 
    {
        int b = get_num(year,mon - 1,day);
        if(check(b)) sg[b] = true;
    }
    if(day == 1)
    {
        int b;
        if(mon == 1)  b = get_num(year - 1,12,31);
        else b = get_num(year,mon - 1,a[mon - 1]);
        if(check(b)) sg[b] = true;
    }
    else 
    {
        int b = get_num(year,mon,day - 1);
        if(check(b)) sg[b] = true;
    }
    
}


void init()
{
    sg[20011104] = 0;
    sg[20011004] = 1;
    sg[20011103] = 1;
    for(int i = 20011102; i >= 19000101; i--)
        if(!sg[i] && check(i)) get_sg(i);
}

void solve()
{
    cin >> y >> m >> d;
    int  x = get_num(y,m,d);
    if(sg[x]) puts("YES");
    else puts("NO");
}

int main()
{
    init();
    cin >> t;
    while(t --) solve();
    return 0;
}

nim游戏

在这里插入图片描述

证明/从知乎搬运

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码
#include<iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int res=0;
    while(n--)
    {
        int a;
        cin>>a;
        res^=a;
    }
    if(res) puts("Yes");
    else puts("No");
    return 0;
}
Northcott Game
解题思路

我们就在题目给出的图上做分析:

  • 如果白子和黑子间没有距离,那黑子一定无路可走,因为,黑子一走,白子一追,对游戏结果没有任何影响
  • 如果黑白子之间有距离,黑子不能朝远离白子的方向走,否则,他一走,减少距离,就相当于减少了石子
  • 轮到白子走时,规律也是这样
  • 所以我们就可以知道将两者之间的距离转化为石子,问题就转化成了nim游戏
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int n,m;

int main()
{
    cin >> n >> m;
    int res = 0;
    while(n --)
    {
        int l,r;
        cin >> l >> r;
        res ^= abs(r - l) - 1;
    }
    if(res) puts("I WIN!");
    else puts("BAD LUCK!");
    return 0;
}
栗酱的异或和
思路

简单的nim游戏,但是呢这题说,先手要从第k堆石子里那;

根据nim游戏结论的证明过程可知:
如果,res = a1 ^ a2 ^ …^ ak ^ … ^an == 0,那不管先手从哪一堆先拿,结果都是输
如果不为零的话,从ak中先拿,就必须使得剩下 ak’ 让 a1 ^ a2 ^ …^ ak’ ^ … ^an == 0 即 ak’ = ak ^ res < ak

代码
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

const int N = 1e5 + 10;
int a[N];
int n,k,t;

void solve()
{
    cin >> n >> k;
    int res = 0;
    for(int i = 1; i <= n; i++) 
    {
        cin >> a[i];
        res ^= a[i];
    }
    if(res == 0) puts("No");
    else 
    {
        res ^= a[k];
        if(res < a[k]) puts("Yes");
        else puts("No");
    }
    
}

int main()
{
    cin >> t;
    while(t--) solve();
    return 0;
}
台阶nim游戏
理解思路

思路上的话,我觉得博客园有篇文章写得挺好的,我就直接放链接了

就是说nim游戏是一堆石子不能增加的游戏,要不断地从其中的一堆石子中取走一些石子,然后台阶nim游戏就是说,把奇数层的阶梯维护成一个nim游戏,根据nim游戏的规则,当奇数层的异或和不为0的时候,先手胜,因为如果后手将偶数层的石子移动到奇数层,先手可以将该奇数层被移过来的石子,又移到下一层偶数层,此时奇数层的状态不受影响,后手想改变状态的话,就要将奇数层的石子移到偶数层,那这时异或和由0变为正整数,先手始终能从奇数层上一部分石子,使得异或和又变成零。如果一开始奇数层的异或和为0的话,同理,但会是后手胜

Georgia and Bob
解题思路
  • 将棋子的位置升序排序后,把相邻棋子两两配对,例如:1 5 6 7 9 12 14 17 配对为:(1,5) , (6,7) , (9,12) , (14,17);
  • 如果棋子的个数是奇数,例如:1,2,3,那该这样配对:(0,1) , (2,3);
  • 然后将每对棋子内的左右棋子的距离当作石子的数量,做nim游戏即可

为什么这样是对的呢?

首先如果移动的是同一对棋子中的左边棋子,那下一个玩家可以以同样的步数移动右边棋子,此时对游戏结果不会造成任何影响

如果移动的是右边棋子,就相当于减少了石子的个数

这样就将问题转化成nim游戏了
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;

vector<int> a;
int t,n;

void solve()
{
    cin >> n;
    a.clear();
    for(int i = 0; i < n; i++) 
    {
        int x;
        cin >> x;
        a.push_back(x);
    }
    if(n % 2) a.push_back(0);
    sort(a.begin(),a.end());
    int res = 0;
    for(int i = 0; i < a.size() - 1; i+=2) res ^= a[i + 1] - a[i] - 1;
    if(res) puts("Georgia will win");
    else puts("Bob will win");
}

int main()
{
    cin >> t;
    while(t--) solve();
    return 0;
}
Georgia and Bob
解题思路
  • 将棋子的位置升序排序后,把相邻棋子两两配对,例如:1 5 6 7 9 12 14 17 配对为:(1,5) , (6,7) , (9,12) , (14,17);
  • 如果棋子的个数是奇数,例如:1,2,3,那该这样配对:(0,1) , (2,3);
  • 然后将每对棋子内的左右棋子的距离当作石子的数量,做nim游戏即可

为什么这样是对的呢?

首先如果移动的是同一对棋子中的左边棋子,那下一个玩家可以以同样的步数移动右边棋子,此时对游戏结果不会造成任何影响

如果移动的是右边棋子,就相当于减少了石子的个数

这样就将问题转化成nim游戏了
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;

vector<int> a;
int t,n;

void solve()
{
    cin >> n;
    a.clear();
    for(int i = 0; i < n; i++) 
    {
        int x;
        cin >> x;
        a.push_back(x);
    }
    if(n % 2) a.push_back(0);
    sort(a.begin(),a.end());
    int res = 0;
    for(int i = 0; i < a.size() - 1; i+=2) res ^= a[i + 1] - a[i] - 1;
    if(res) puts("Georgia will win");
    else puts("Bob will win");
}

int main()
{
    cin >> t;
    while(t--) solve();
    return 0;
}

反常nim游戏

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

博弈论——组合游戏(Bash和nim) 的相关文章

  • 如何显示 NUL 分隔数据的中间管道结果?

    如何组合以下两个命令 find print0 grep z pattern tr 0 n find print0 grep z pattern xargs 0 my command 进入单个管道 如果我不需要 NUL 分隔符那么我可以这样做
  • 如何在bash中列出所有后台pid

    要么我无法正确表达我的搜索 要么答案不容易找到 但我正在尝试找出如何列出我的所有后台任务 PID 例如 到目前为止 我发现要列出我们使用的最后一个 PID 但现在我想列出之前任务的 PID 如果存在 但我找不到如何做到这一点 最终我想列出我
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • 使用正确的头打印文件名

    我想获取当前目录中的文件名 使得文件的第一行等于myWord 我想结合find type f命令与 exec选项与head 1 filename但无济于事 有没有一些聪明的 单行的解决方案来解决这个问题 您可以使用find with awk
  • bash 支持字边界正则表达式吗?

    我试图在再次添加该单词之前匹配列表中是否存在该单词 以避免重复 我正在使用 bash 4 2 24 并尝试以下操作 foo bmyword b also foo
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 语法错误:for 循环变量不正确

    我正在尝试编写一个可以在后台调高收音机音量的脚本 bin sh for i 80 i lt 101 i do amixer cset numid 1 i sleep 60 done 但我有问题 alarmclock vol sh 3 ala
  • 如何在递归调用函数时阻止 bash 创建子 shell

    这是一个计算阶乘的简单 shell 函数 bin bash function factorial if 1 lt 2 then echo 1 else echo 1 factorial 1 1 fi factorial 1 但我发现这个脚本
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何制作一个 bash 脚本来同时创建 40 个程序实例?

    我是新来的bash and Linux 我编写了一个程序 我想创建多个同时实例 现在 我通过打开 10 个新终端 然后运行该程序 10 次 我运行的命令是php home calculatedata php 使用 bash 脚本执行此操作的
  • 如何判断 Bash 中是否存在文件?

    这会检查文件是否存在 bin bash FILE 1 if f FILE then echo File FILE exists else echo File FILE does not exist fi 我如何只检查文件是否存在not ex
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 如何查找所有以句号结尾的单词?

    我有一个包含许多以 a 结尾的单词的文件 其中大部分是缩写 例如 etc p s 如何输出一个仅显示一次所有这些单词的列表 所有单词前面都有一个空格 因此可以使用该空格来查找单词的开头 没有一个单词出现在该行的开头 文件中没有句子 因此句点
  • 获取变量的名称作为输入并使用该名称更改变量

    我从脚本用户那里获取变量的名称作为第一个参数 并将该变量的值回显到控制台 bin bash variablename 1 echo The value of variablename is variablename 这太棒了 我无法开始工作
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is

随机推荐

  • 进程的五种通信方式

    一 管道 1 什么是管道 我们把一个进程连接到另一个进程的数据流称为一个管道 它是最古老的进程通信形式 2 原型 匿名管道 include
  • 【云原生之Docker实战】使用Docker部署File Manager文件管理系统

    云原生之Docker实战 使用Docker部署File Manager文件管理系统 一 File Manager简介 1 File Manager简介 2 File Manager特点 二 检查宿主机系统版本 三 检查本地docker环境
  • 微软禁俄下载、开源投毒攻击、Rust不会重写Linux、开放原子峰会7月举办

    WeOpen Insight 是腾源会推出的 开源趋势与开源洞见 内容专栏 不定期为读者呈现开源圈内的第一手快讯 优质工具盘点等 洞察开源技术发展的风向标 预见未来趋势 1 开源社区新闻 1 Linus Torvalds 称并未用 Rust
  • java计算月份所在的季度

    java计算月份所在的季度 月份 2 3 下班的时候无意中看到同事写的根据月份计算季度的代码 获取两个时间内的季度集合 返回结果说明 quarterList1 2019 1 quarterList2 2019年1季度 param start
  • IDEA Writing classes... 比较慢

    IDEA配置修改如下 1 File gt Settings 2 Build Execution Deployment gt Compiler Build process heap size 配置为 2048 3 Build Executio
  • hex转换成C语言源程序吗,第6节:把.c源代码编译成.hex机器码的操作流程

    从业十年 教你单片机入门 第6讲 第一步 打开一个现成的工程 双击桌面 keil uVision4 的图标启动keil软件 如果发现此软件默认打开了一个之前已经存在的工程 请点击上面 Project 选项 在弹出的下拉菜单中选择 Close
  • html js实现分页代码,js前端分页实现

    最近做的一个项目 整个页面的数据更新要纯ajax实现 没办法 连分页都得由我来写了 基本思路还是像后台那样实现分页 后台实现分页其实也就是用后台的程序来处理那段分页的模版 于是我想 下面是分页的模版 1 代码 JavaScript 代码 h
  • 常见的颜色空间概念

    文章目录 1 RGB颜色空间 2 HSV颜色空间 3 YCbCr颜色空间 4 Lab颜色空间 5 YUV颜色空间 1 RGB颜色空间 是最常见的面向硬件设备的彩色模型 它是人的视觉系统密切相连的模型 根据人眼结构 所有的颜色都可以看做是3种
  • 2017年阳光私募基金一季度报告

    2017年阳光私募基金一季度报告 时间 2017 05 09 10 14 00 来源 网友评论 0 条 一 证券类私募行业大数据 一 证券类私募行业大数据 一 规模篇 1 私募基金管理规模达11 90万亿 证券类规模为2 63万亿 2 百亿
  • C语言eigen存为txt文件,如何使用线性代数的C模板库Eigen?

    我有一个矩阵的图像处理算法 我有自己的矩阵运算代码 乘法 逆 但我使用的处理器是ARM Cortex A8处理器 它有NEON协处理器进行矢量化 因为矩阵运算是SIMD操作的理想情况 我要求编译器 mfpu neon mfloat abi
  • webrtc音频引擎之audio_processing介绍

    audio processing模块为语音处理的精华 包含音频的回音处理 降噪处理 自动增益处理等音频的核心处理业务算法 静音检测在另外一个模块 不知道新版与这基本算法放到了同一个模块木有 模块结构为 1 aec和aecm 也就是回音消除
  • 【Kubernetes 008】多种类型控制器区别及实际操作详解(RS,Deployment,DaemonSet,Job,ConJob)

    Pod是k8s中的基本结构 前面我们已经创建过一个 但是生产环境中往往不需要我们自己去创建pod 而是通过创建管理pod的控制器而达到自动批量管理pod的目的 这一节我们就一起来看看k8s中有哪些控制器 以及这些控制器的一些基本操作 我是T
  • Spring配置DataSource数据源

    在Spring框架中有如下3种获得DataSource对象的方法 1 从JNDI获得DataSource 2 从第三方的连接池获得DataSource 3 使用DriverManagerDataSource获得DataSource 一 从J
  • flask笔记

    python中的web框架 a socket服务端 b 路由转发 c 模板渲染 Django 同步框架 a 用的别人的 bc自己写的 Flask 同步框架 a 用的别人的 b自己写的 c用的别人的 jinja2 Tornado 异步框架 a
  • 毕业设计 单片机LSRB算法的走迷宫小车 - 嵌入式 stm32

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 马达驱动器 L298N Mpu 6050 60 RPM 直流电机 红外传感器 Arduino Pro mini 5 软件说明 LSRB 算法 6 最后 0 前言 这两年
  • JavaSE进阶

    1 使用集成开发工具eclipse 1 1 java的集成开发工具很多 包括 eclipse Intellij IDEA netbeans eclipse IBM开发的 eclipse翻译为 日食 寓意吞并SUN公司 SUN是太阳 最终没有
  • 坐标转换、地球转火星、百度转火星(python版)

    一 坐标介绍 1 地球坐标 GPS WGS84 地理坐标系统 2 火星坐标 GCJ 02 投影坐标系统 中国自己在WGS84基础上加密而成 3 地球坐标 BD 09 投影坐标系统 百度地图使用 二 坐标转换 import math pi 3
  • 掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表

    文章目录 垂直分表 拆分方法 举例 垂直分库 水平分表 水平分库 小结 垂直角度 表结构不一样 水平角度 表结构一样 垂直分表 需求 商品表字段太多 每个字段访问频次不 样 浪费了IO资源 需要进行优化 也就是 大表拆小表 基于列字段进行的
  • Mongodb创建用户角色

    文章目录 一 Mongodb数据库用户角色 二 创建用户 其权限有哪些 1 创建用户语法格式 2 字段解析 三 创建用户实列 总结 一 Mongodb数据库用户角色 MongoDB采用基于角色的访问控制 RBAC 来确定用户的访问 授予用户
  • 博弈论——组合游戏(Bash和nim)

    博弈论1 组合游戏 特征 两个玩家 一个状态集合 游戏规则是指明玩家从一个状态可以移动到哪些状态 玩家轮流进行移动 如果当前处于的状态无法移动 则说明游戏结束 大部分时候 无论玩家如何选择 游戏会在有限步操作内结束 通常的解题步骤 首先设置