p1434[shoi2002]滑雪(21.10.21)(代码片段)

未定_ 未定_     2023-01-19     522

关键词:

原题链接
题意:分析:因为题目没有要求起点,也就是二维数组任意一个位置都可以作为起点向四周发散,所以想到用搜索。
可以用深度优先搜索算法解决,需要另设一个二维数组存储当前位置是否走过。
详细解释见代码。

#include<iostream>
int a[105][105],d[105][105];
int n,m,ans=0;
using namespace std;
bool check(int a,int b)//判断该位置是否越界

    if(a<=0||b<=0||a>n||b>n)
        return 0;
    else return 1;

int dir[4][2]= -1,0,0,-1,1,0,0,1;//控制四个方向的移动
int dfs(int x,int y)

    if(d[x][y])//如果走过了,直接返回该位置可构建的长度即可。
        return d[x][y];
    int num=0;//这里是把x,y位置当做起点记录
    for(int i=0; i<4; i++)//4个方向循环
    
        int newx=x+dir[i][0];
        int newy=y+dir[i][1];
        if(check(newx,newy)&&a[x][y]<a[newx][newy])
            num=max(dfs(newx,newy),num);//找到四个方向中最长的路径
    
    num++;//当前位置,长度在之前的基础上加一
    return d[x][y]=num;//返回现在的长度

int main( )

    cin>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin>>a[i][j];
    for(int i=1; i<=n; i++)
    
        for(int j=1; j<=m; j++)
        
                ans=max(ans,dfs(i,j));//从所有起点里找到最大值
        
    
    cout<<ans<<endl;


这个题有点像Red and Black
DFS做法:

#include<bits/stdc++.h>
using namespace std;
char room[23][23];
int dir[4][2]= -1,0,0,-1,1,0,0,1;
int Wx, Hy, num;
#define CHECK(x, y) (x<Wx && x>=0 && y >=0 && y<Hy)
struct node

    int x,y;
;
void DFS(int dx, int dy)

    room[dx][dy] = '#';
    num++;
    for(int i = 0; i < 4; i++)
    
        int newx = dx + dir[i][0];
        int newy = dy + dir[i][1];
        if(CHECK(newx, newy) && room[newx][newy] == '.')
        
            DFS(newx, newy);
        
    

int main()

    int x, y, dx, dy;
    while(cin>>Wx>>Hy)
    
        if(Wx==0&&Hy==0)
            break;
        for (y = 0; y < Hy; y++)
        
            for (x = 0; x < Wx; x++)
            
                cin >> room[x][y];
                if(room[x][y] == '@')
                
                    dx = x;
                    dy = y;
                
            
        
        num = 0;
        DFS(dx, dy);
        cout << num << endl;
    

    return 0;


BFS做法:

#include<bits/stdc++.h>
using namespace std;
char room[23][23];
int dir[4][2]= 
    -1,0,//向左
    0,-1,//向上
    1,0,//向右
    0,1//向下
;
int Wx,Hy,num;
#define CHECK(x,y)(x<Wx&&x>=0&&y>=0&&y<Hy
struct node

    int x,y;
;
void BFS(int dx,int dy)

    num=1;
    queue<node>q;
    node start,next;
    start.x=dx;
    start.y=dy;
    q.push(start);
    while(!q.empty())
    
        start=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        
            next.x=start.x+dir[i][0];
            next.y=start.y+dir[i][1];
            if(CHECK(next.x,next.y)&&room[next.x][next.y]=='.')
            
                room[next.x][next.y]='#';
                num++;
                q.push(next);
            
        
    

int main()

    int x,y,dx,dy;
    while(cin>>Wx>>Hy)
    
        if(Wx==0&&Hy==0)
            break;
        for(y=0;y<Hy;y++)
        
            for(x=0;x<Wx;x++)
            
                cin>>room[x][y];
                if(room[x][y]=='@')
                
                    dx=x;
                    dy=y;
                
            
        
        num=0;
        BFS(dx,dy);
        cout<<num<<endl;
    
    return 0;


p1434[shoi2002]滑雪dfs(代码片段)

  题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一... 查看详情

p1434[shoi2002]滑雪(代码片段)

Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给... 查看详情

shoi2002滑雪(代码片段)

题面Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数... 查看详情

p1434滑雪

P1434滑雪题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域... 查看详情

[shoi2002]滑雪(记忆化搜索模版)(代码片段)

题目链接:https://www.luogu.com.cn/problem/P1434 想法:记忆化搜索板子题:#include<algorithm>#include<string>#include<string.h>#include<vector>#include<map>#include<stack>#include<set>#include<queue>#include<math.h>#include&l... 查看详情

p1434滑雪

题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二... 查看详情

[shoi2002]滑雪-题解报告(代码片段)

题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二... 查看详情

洛谷p1434滑雪

题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二... 查看详情

洛谷——p1434滑雪

https://www.luogu.org/problem/show?pid=1434#sub题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一... 查看详情

搜索洛谷p1434滑雪

 P1434滑雪题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。... 查看详情

周末学习总结(21.10.23)

...问题:LIS与LCS字符串和多维数组学习笔记P1434[SHOI2002]滑雪心心念念的洛谷账号终于能注册了,再也不用干看着不能交代码了,激动的我先上去见见世面,(看了普及+/提高的简单数论题),好吧,... 查看详情

cogs1224.[shoi2002]百事世界杯之旅(期望概率)

COGS1224.[SHOI2002]百事世界杯之旅★  输入文件:pepsi.in  输出文件:pepsi.out   简单对比 时间限制:1s  内存限制:128MB 【问题描述】 “……在2002年6月之前购买的百事任何饮料的瓶盖上都... 查看详情

shoi2002百事世界杯之旅|概率论(代码片段)

题目:SHOI2002若当前已经有了x种,再买一个买到不一样的概率为(n-x)/n,要使这个概率变成1,则至少再买n/(n-x)瓶。1#include<cstdio>2#include<string>34longlongmax(longlongx,longlongy)5returny<x?x:y;678longlonggcd(longlongx,longlongy 查看详情

luogup1291[shoi2002]百事世界杯之旅

题目链接luoguP1291[SHOI2002]百事世界杯之旅题解设\(f[k]\)表示还有\(k\)个球员没有收集到的概率再买一瓶,买到的概率是\(k/n\),买不到的概率是\((n-k)/k\)那么\(f[k]=f[k]*(n-k)/n+f[k-1]*k/n+1\)移向一下\(f[k]=f[k-1]+n/k\)代码#include<cstdio>#inclu... 查看详情

shoi2002百事世界杯之旅(代码片段)

题目链接:戳我看到期望,想着不要从前转移。一次后能买到不同种类的概率为\(\fracn-in\)两次后能买到不同种类的概率为\(\fracin\times\fracn-in\)n次后能买到不同种类的概率为\((\fracin)^n\times\fracn-in\)设总期望为\(E=\fracn-in\times1+\fracin\... 查看详情

p1291[shoi2002]百事世界杯之旅(概率)(代码片段)

P1291[SHOI2002]百事世界杯之旅设$f(n,k)$表示共n个名字,剩下k个名字未收集到,还需购买饮料的平均次数则有:$f(n,k)=fracn-kn*f(n,k)+frackn*f(n,k+1)+1$移项整理,可得:$f(n,k)=f(n,k+1)+fracnk$根据递推式,可得:$f(n,0)=nsum_k=1^nfrac1k$蓝后g 查看详情

p1291[shoi2002]百事世界杯之旅(代码片段)

题目描述“……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯。还不... 查看详情

●洛谷p1291[shoi2002]百事世界杯之旅

题链:https://www.luogu.org/recordnew/show/5861351题解:dp,期望 定义dp[i]表示还剩下i个盖子没收集时,期望还需要多少次才能手机完。 初始值:dp[0]=0 显然对于一个状态,我们随机得到一个盖子,有两种可能: 1.得到了曾经没有的盖子... 查看详情