经典算法50例 P1

1.巴斯卡三角形
在这里插入图片描述
也就是有以下一些特点:把他看成一个正方形但只有右下部分。1.第一列全是1 2,对角线上全是1
3.对于其他位置 等于他的上一行对应列和上一行上一列的值相加。
也就是 dp[i][j]=dp[i-1][[j+dp[i-1][j-1]

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//巴斯卡三角形,假设就是给一个N作为规模
int main(){
    int n,i,j;
    scanf("%d",&n);
    //n就是相应的规模
    //应该是这个数组,上半部分全是空格,先初始化
    //然后开始格式化
    char Str[n-1][n-1];
   // memset(Str,' ',sizeof(Str));
    Str[0][0]='1';
    for(i=1;i<n;i++)
    for(j=1;j<=i;j++){
       Str[i][0]='1';
       if(i==j)
            Str[i][j]='1';
       else{
        int a=Str[i-1][j]-'0'+Str[i-1][j-1]-'0';
        Str[i][j]=a+'0';
       }
    }
    //然后开始输出
    for(i=0;i<n;i++)
    for(j=0;j<=i;j++){
        if(i==j){
             printf("%c",Str[i][j]);
             printf("\n");
        }
        else{
             printf("%c",Str[i][j]);
        }
    }


}

三色旗问题:
使用到了数组指针,分成三类,分别是蓝色的指针,白色的指针,和红色的指针。
并且这些有三种情况,以白色的指针为主,当一个值是白色的时,则指针数加一,如果是蓝色的话,那就和蓝色的位置交换,并且将蓝色的位置和白色的位置都加一,最后如果是红色的话,因为红色的指针是在最后 所以是指针减一,并且白色位置加一,然后将对应位置换位。
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//三色旗,主要就是指针的作用
//再写一个用来交换的
char Str[5]={'r','b','w','w','r'};
void swap(int x,int y){
    //交换这个两个的位置
    char temp=Str[x];
    Str[x]=Str[y];
    Str[y]=temp;
}
int main(){
    //先创建一个数组用来当例子
        int i;
    int len=strlen(Str);
    int flagB=0;
    int flagW=0;
    int flagR=len-1;
    //开始计算
    while(flagW<flagR){
        if(Str[flagW]=='w')//如果是中间的白的,那就加一
            flagW++;
        if(Str[flagW]=='b'){
            //如果是蓝的,那就换位再加加
            swap(flagW,flagB);
            flagB++;
            flagW++;
        }
        if(Str[flagW]=='r'&&flagW<flagR){
            //如果是红的,那就换位,然后对应的一个向后退一位,w不需要动
            swap(flagW,flagR);
            flagR--;
        }

    }
    //开始输出
    for(i=0;i<len;i++)
        printf("%c",Str[i]);
}

老鼠走迷宫(-)
应该是直接使用dfs,来判断是否有路

在这里插入图片描述
和本题无关,但是就是一个dfs的算法,会有一个判断函数,用来判断这个点能不能用,然后有两个数组来指示前后左右,最后就是dfs(map,x,y)判断前后左右是否可以,直到走到对应的位置,return true

骑士走键盘
这道题的核心递归思想参数有x的起点,y的起点,总共走了几步

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//首先是一个八乘八的数组,表示这个地图
int map[8][8];
int Stepx[8]={-2, -1, 1, 2, 2, 1, -1, -2};
int Stepy[8]={1, 2, 2, 1, -1, -2, -2, -1};//这代表能走的方向
int i;
//然后开始写深度遍历
bool DFS(int starx,int stary,int index){
    //首先判断这个位置是不是64,也就是走到头了,如果是,那就说明正确,如果不是那就说明还得进行
    map[starx][stary]=index;
    if(index==64)
        return true;
        //开始分别判断其他位置
        for(i=0;i<8;i++){
            int newx=starx+Stepx[i];
            int newy=stary+Stepy[i];
            //开始判断这个位置合不合理
            if(newx>=0&&newx<8&&newy>=0&&newy<8&&map[newx][newy]==0){//没过界,并且可以访问
               DFS(newx,newy,index+1);
        }
        }

    map[starx][stary]=0;
    return false;
}
int main(){
    //对map初始化
    memset(map,0,sizeof(map));
    if(DFS(0,0,1))
        printf("YES");
    else
        printf("No");

}

发布了88 篇原创文章 · 获赞 5 · 访问量 3542

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/105115364