首页 > 其他分享 >洛谷题单指南-递推与递归-P1259 黑白棋子的移动

洛谷题单指南-递推与递归-P1259 黑白棋子的移动

时间:2024-02-20 17:26:51浏览次数:30  
标签:-- 洛谷题 ooo 两步 P1259 oooo int 递推

原题链接:https://www.luogu.com.cn/problem/P1259

题意解读:要打印最终的状态,关键在找到一些变化的规律,直接的暴力搜索复杂度太高。

解题思路:

从样例出发

ooooooo*******--
oooooo--******o*
oooooo******--o*
ooooo--*****o*o*
ooooo*****--o*o*
oooo--****o*o*o*
oooo****--o*o*o*
ooo--***o*o*o*o*
ooo*o**--*o*o*o*
o--*o**oo*o*o*o*
o*o*o*--o*o*o*o*
--o*o*o*o*o*o*o*

 可以看到,当n = 7时,通过两步变化,可以得到n = 6的初始情况再加上一组o*

同样,当n = 6时,通过两步变化,可以得到n = 5的初始情况再加上一组o*

同理,当n = 5时,通过两步变化,可以得到n = 4的初始情况再加上一组o*

而当n = 4时,则没有上述规律,有特定的变化步骤来得到结果:

oooo****--
ooo--***o*
ooo*o**--*
o--*o**oo*
o*o*o*--o*
--o*o*o*o*

可以总结出,当n > 4时,总能通过同样的变化将问题缩小为处理n - 1、n - 2......一直到4的情况,进行特殊处理即可。

而当n > 4时,两步操作为:

1、将最后一个o、第一个*与空白处交换位置

2、将连续*的最后两个,与空白处交换位置

这样就得到了n - 1的情况,最后两个字符是o*

因此,完整的流程为:

1、初始化字符串

2、不断进行上述的两步操作,使得字符串前10个字符变成oooo****--,即n = 4

3、再针对n = 4的情况特殊处理

此题本质上是一个分治思想,具体细节请参考代码。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 210;

string t[5] = {
    "ooo--***o*",
    "ooo*o**--*",
    "o--*o**oo*",
    "o*o*o*--o*",
    "--o*o*o*o*"
};

char s[N];
int n;

//输出s字符串
void print()
{
    for(int i = 1; i <= 2 * n + 2; i++) cout << s[i];
    cout << endl;
}

int main()
{
    cin >> n;

    //初始化s字符串
    for(int i = 1; i <= n; i++) s[i] = 'o';
    for(int i = n + 1; i <= 2 * n; i++) s[i] = '*';
    s[2 * n + 1] = s[2 * n + 2] = '-';

    print();

    int w = 2 * n + 1; //第一个空白位置

    while(w != 9) { //多于2 * 4个棋子时
        int lastO = (w - 1) / 2; //最后一个'o'的位置
        swap(s[lastO], s[w]);
        swap(s[lastO + 1], s[w + 1]);
        print();

        int lastS = w - 1;//连续'*'的最后一个位置
        w = lastO; // 更新第一个空白所在位置
        
        swap(s[lastS - 1], s[w]);
        swap(s[lastS], s[w + 1]);
        print();

        w = lastS - 1; 
    }

    //当w前面只有2 * 4个棋子时,特殊处理
    for(int i = 0; i < 5; i++)
    {
        cout << t[i];
        for(int j = 11; j <= 2 * n + 2; j += 2)
        {
            cout << "o*";
        }
        cout << endl;
    }

    return 0;
}

 

标签:--,洛谷题,ooo,两步,P1259,oooo,int,递推
From: https://www.cnblogs.com/jcwy/p/18023581

相关文章

  • 洛谷题单指南-递推与递归-P3612 [USACO17JAN] Secret Cow Code S
    原题链接:https://www.luogu.com.cn/problem/P3612题意解读:字符串加长的时候,是先把最后一个字符接上,再拼接其余字符,注意不是翻转,要找第n个字符,就要看字符串加长几次后长度能超过n,然后在加长后的字符串中找第n个字符。解题思路:如果直接通过模拟法,字符串长度太长,且要找的第n个数......
  • 洛谷题单指南-递推与递归-P1990 覆盖墙壁
    原题链接:https://www.luogu.com.cn/problem/P1990题意解读:用两种可旋转的形状铺满N*2的区域,求方案数,可以使用递推。解题思路:步骤1、设f[i]表示铺满i*2的区域的方案数根据要求,i*2区域最后一列有4种可能的铺法:如果采用图1铺法,则有f[i]=f[i-1]如果采用图2铺法,则有f[i]=f......
  • 洛谷题单指南-递推与递归-P1164 小A点菜
    原题链接:https://www.luogu.com.cn/problem/P1164题意解读:要求正好把钱花完,并且统计不同的点菜方案数,本质上是一个背包问题,给定背包体积,要求物品正好装满背包的方案数。解题思路:1、最直观的解法是暴搜:DFS枚举每一道菜,有点或者不点两种选择,并且累加上已花费的总金额递归前,判断......
  • 洛谷题单指南-递推与递归-P2437 蜜蜂路线
    原题链接:https://www.luogu.com.cn/problem/P2437题意解读:根据题目要求,只能从标号小的蜂房爬到标号大的相邻蜂房,即每次要么爬到+1的蜂房,要么爬到+2的蜂房,本质上是一个斐波那契数列问题,和数楼梯问题一样。解题思路:要求从m号蜂房到n号蜂房的路径,即走n-m级楼梯的方案,n最大1000,同样......
  • 洛谷题单指南-递推与递归-P1928 外星密码
    原题链接:https://www.luogu.com.cn/problem/P1928题意解读:要对形如xxx[Nxxx]xxx的字符串进行解码,[]内第一个数表示括号中字符串重复的次数,可以嵌套。解题思路:用递归进行处理,设函数decode(start,end)将下标从start到end之间字符串进行解码递归过程如下:遍历start~end的每一个字......
  • Codeforces Round 113 (Div. 2)E. Tetrahedron(dp、递推)
    目录题面链接题意题解代码总结题面链接E.Tetrahedron题意从一个顶点出发走过路径长度为n回到出发点的方案总数题解考虑dp\(f[i][0|1|2|3]\):走了i步,现在在j点的方案总数转移:\(f[i][0]=f[i-1][1]+f[i-1][2]+f[i-1][3]\)\(f[i][1]=f[i-1][0]+f[i-1][2]+f[i-1][3]\)\(f......
  • 洛谷题单指南-递推与递归-P1464 Function
    原题链接:https://www.luogu.com.cn/problem/P1464题意解读:虽然a、b、c可输入的范围比较大,但是递归中,只会限制在0-20以内,由于递归中有大量的重复计算,因此需要采用记忆化搜索来保存已经计算过的递归函数值。解题思路:定义三位数组LLmem[25][25][25],mem[a][b][c]保存w(a,b,c)的......
  • 洛谷题单指南-递推与递归-P1028 [NOIP2001 普及组] 数的计算
    原题链接:https://www.luogu.com.cn/problem/P1028题意解读:给定n,构造数列,可以用递归或者递推。解题思路:1、递归定义count(n)返回数列的个数  n==1时,count(n)=1  n!=1时,count(n)=1+count(1)+count(2)+...+count(n/2)注意,递归会导致大量重复计算,需要用一个hash......
  • 洛谷题单指南-递推与递归-P1044 [NOIP2003 普及组] 栈
    原题链接:https://www.luogu.com.cn/problem/P1044题意解读:一组数入栈、出栈的方案数,如果了解卡特兰数,此题可以秒杀;如果不了解,也可以通过递归或者递推来解决;最次,可以通过DFS暴搜出方案数,当然对于n个数,一共有n次入栈、n次出栈,一共2n次,每次要么入栈要么出栈,总搜索次数在22n规模,n最......
  • 洛谷题单指南-递推与递归-P1002 [NOIP2002 普及组] 过河卒
    原题链接:https://www.luogu.com.cn/problem/P1002题意解读:从A(0,0)点走到B(n,m)点,只能向右或者向下,C点以及其控制点不能走。解题思路:根据题意,此题要么递归(DFS),要么递推(动态规划)先分析数据规模,最大从起点到终点要走40步,每个步有2种走法,一共240种路径,DFS会超时,且方案数必须用longlong......