深度优先搜索

理解深度优先搜索的关键在于解决“当下该如何做”。至于“下一步该如何做”则与“当下该如何做”是一样的。
基本模型:

void dfs(int step)
{
    判断边界
    尝试每一种可能 for(i=1;i<=n;i++)
    {
       继续下一步 dfs(step+1)
    }
    返回
}
//或者是
int dfs(int t)
{
    if(满足输出条件)
    {
        输出解;
    }
    for(int i=1;i<=尝试方法数;i++)
        if(满足进一步搜索条件)
        {
            为进一步搜索所需要的状态打上标记;
            dfs(t+1);
            恢复到打标记前的状态;//也就是说的{回溯一步}
        }
}

示例1:输入整数n,全排列1~n

#include "stdio.h"
int a[10],book[10],n;
void dfs(int step){
    int i; 
    if(step==n+1){
        for(i=1;i<=n;i++){
            printf("%d",a[i]);
        }
        printf("\n");
        return;
    }
    for(i=1;i<=n;i++){
        if(book[i]==0){
            a[step]=i;
            book[i]=1;
            dfs(step+1);
            printf("\n");
            book[i]=0;
        }
    
    }
    return;
}
int main(){
    scanf("%d",&n);
    dfs(1);
    return 0;
}

示例2:□ □ □ + □ □ □ = □ □ □,在□中填入1~9使等式成立且每位数字只出现一次

#include "stdio.h"
int a[10],book[10],sum=0;
void dfs(int step){
    int i;
    if(step==10){
        if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9]){
            sum++;
            printf("%d%d%d+%d%d%d=%d%d%d ",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]); 
        }
        return;
    }
    for(i=1;i<=9;i++){
        if(book[i]==0){
            a[step]=i;
            book[i]=1;
            dfs(step+1);
            book[i]=0;
        }
    }
    return;
}
int main(){
    dfs(1);
    printf("\n");
    printf("一共有%d组结果",sum/2);
}

示例3:迷宫。
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

#include "stdio.h"
int m,n,p,q,min=99999,sum=0;
int a[51][51],book[51][51];
void dfs(int x,int y,int step){
    int next[4][2]={
    {0,1},//向右走 
    {1,0},//向下走
    {0,-1},//向左走
    {-1,0}};//向上走
    int tx,ty,k;
    //判断是否到达位置 
    if(x==p&&y==q){
        if(step<min){
            sum++;
            min=step;
        }
        return;//很重要 
    }
    //枚举4种走法 
    for(k=0;k<=3;k++){
        //计算下一个点坐标 
        tx=x+next[k][0];
        ty=y+next[k][1];
        //判断是否越界 
        if(tx<1||tx>n||ty<1||ty>n){
            continue;
        }
        //判断该点是否为障碍物或已经在走过的路径中 
        if(a[tx][ty]==0&&book[tx][ty]==0){
            book[tx][ty]=1;
            dfs(tx,ty,step+1);
            book[tx][ty]=0;
        }
    }
    return ; 
}
int main(){
    int i,j,startx,starty;
    scanf("%d %d",&n,&m);//n行m列
    //读入迷宫 
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    //读入起止点坐标
    scanf("%d %d %d %d",&startx,&starty,&p,&q);
    //从起始点开始搜索
    book[startx][starty]=1;
    dfs(startx,starty,0);
    printf("共有%d条路径",sum)
    printf("\n");
    printf("最短路径走了%d步",min);
    return 0;  
}

接竹竿

"*****接竹竿*****"
# 牌的大小范围:1——9
class struct_1:
    data=[]
    head:int
    tail:int
class struct_2:
    data=[]
    head:int
    tail:int
class stack:
    data=[]
    top:int
def PTbamboo():
    book=[]
    q1=struct_1()
    q2=struct_2()
    s=stack()
    q1.head=1
    q1.tail=1
    q2.head=1
    q2.tail=1
    s.top=0
    for i in range(100):
        q1.data.append(0)
        q2.data.append(0)
        s.data.append(0)
    for i in range(1,10):
        book.append(0)
    for i in range(6):
        a=input("请一号拿牌:")
        q1.data[q1.tail]=a
        q1.tail+=1
    for i in range(6):
        b=input("请二号拿牌:")
        q2.data[q2.tail]=b
        q2.tail+=1
    print(q1.data[:10])
    print(q2.data[:10])
    while q1.head<q1.tail and q2.head<q2.tail:
        t=int(q1.data[q1.head])
        if book[t]==0:
            q1.head+=1
            s.top+=1
            s.data[s.top]=t
            book[t]=1
        else:
            q1.head+=1
            q1.data[q1.tail]=t
            q1.tail+=1
            while s.data[s.top]!=t:
                book[s.data[s.top]]=0
                q1.data[q1.tail]=s.data[s.top]
                q1.tail+=1
                s.top-=1
        t=int(q2.data[q2.head])
        if book[t]==0:
            q2.head+=1
            s.top+=1
            s.data[s.top]=t
            book[t]=1
        else:
            q2.head+=1
            q2.data[q2.tail]=t
            q2.tail+=1
            while s.data[s.top]!=t:
                book[s.data[s.top]]=0
                q2.data[q2.tail]=s.data[s.top]
                q2.tail+=1
                s.top-=1
    if q2.head==q2.tail:
        print("1 win!")
        print("一号玩家手中的牌为:",end='')
        for i in range(q1.head,q1.tail):
            print(q1.data[i],end='')
        if s.top>0:
            print("桌上的牌为:",end='')
            for i in range(1,s.top+1):
                print(s.data[i],end='')
        else:
            print("桌上已经没牌了!")
    else:
        print("2 win!")
        print("二号玩家手中的牌为:",end='')
        for i in range(q2.head,q2.tail):
            print(q2.data[i],end='')
        if s.top>0:
            print("桌上的牌为:",end='')
            for i in range(1,s.top+1):
                print(s.data[i],end='')
        else:
            print("桌上已经没牌了!")
# PTbamboo()

排序

桶排序:
桶排序的思想:数组x的下标是有序的,例如x[0],x[1],x[2]中的0,1,2;
桶排序的要旨是把待排序的数据放到数组x中,根据x中的最大值m设置数组y[0]->y[m]=0;
循环遍历x数组i in range(m+1)次,如果x[j]=i,那么y[x]=y[x]+1
现在x中的元素变成了数组y中的下标中值不为0的下标

def bucket_sort():
    import random
    x,y=[],[]
    for i in range(20):         #用random函数随机生成一组数据放到数组x中
        a=random.randint(0,12)
        x.append(a)
    print("x中的原数据:",x)
    m=max(x)                    #找出x中的最大值m,m决定了数组y的长度
    print("数组x中的最大值:",m)
    for i in range(0,m+1):     #数组y的长度为m+1,并赋值为0
        y.append(0)
    for i in range(20):
        y[x[i]]+=1
    print("y中的值",y)
    for i in range(m+1):
        for j in range(0,y[i]):
            print(i,end=' ')
bucket_sort()

冒泡排序:

def bubble_sort():
    import random
    x=[]
    m=eval(input("输入随机生成数据的个数:"))
    for i in range(m):
        a=random.randint(0,20)   #随机生成数的大小范围
        x.append(a)
    print("数组x中的数据:",x)
    for i in range(1,len(x)):
        for j in range(0,len(x)-i):
            if x[j]<x[j+1]:
                x[j],x[j+1]=x[j+1],x[j]
    print("排序后:",x)
bubble_sort()

快速排序:

def Quick_sort(lists:list,left:int,right:int):
    # 跳出递归判断
    if left>=right:
        return lists
    # 选择参考点,该调整范围的第1个值
    key=lists[left]
    low=left
    high=right
    # 循环判断直到遍历全部
    while left<right:
        # 从右边开始查找大于参考点的值
        while left<right and key<=lists[right]:
            right-=1
        lists[left]=lists[right]  # 这个位置的值先挪到左边
        # 从左边开始查找小于参考点的值
        
        while left<right and key>=lists[left]:
            left+=1
        lists[right]=lists[left]  # 这个位置的值挪到右边
        
    # 写回改成的值
    lists[left]=key
    
    # 递归,并返回结果
    Quick_sort(lists,low,left-1)  # 递归左边部分
    Quick_sort(lists,left+1,high) # 递归右边部分
    return lists

lists=[4,5,3,8,6,2,7,9,4,1]
Quick_sort(lists,0,len(lists)-1)
print(lists)

模拟链表

def ALlist():
    data=[]
    right=[]
    for i in range(1,20):
        data.append(0)
        right.append(0)
    n=int(input("请决定输入几个数:"))
    for i in range(1,n+1):
        a=input("please input:")
        data[i]=a
        if i==n:
            right[i]=0
        else:
            right[i]=i+1
    tail=n+1
    x=input("请输入待插入的数:")
    data[tail]=x
    t=1
    while(t!=0):
        if data[right[t]]>data[tail]:
            right[tail]=right[t]
            right[t]=tail
            break
        t=right[t]
    print(data)
    print(right)
    t=1
    while t!=0:
        print(data[t],end=' ')
        t=right[t]
ALlist()

爬取QQ音乐流行指数榜

import requests
import re
def Get_HTML(url):
    headers={'User-Agent':'Mozilla/5.0'}
    try:
        r=requests.get(url,headers=headers)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        print("error!")
def ParsePage(html):
    pattern=re.compile('<div class="songlist__songname">.?<a title="(.?)" href.?>.?</a>.?<div class="songlist__artist">.?<a class.?>(.?)</a>',re.S)
    items=re.findall(pattern,html)
    return items
def Print(items):
    name=[]
    tplt="{0:^10}{1:^25}{2:^25}"
    print("{0:^10}{1:^25}{2:^18}".format("排名","歌名","歌手",chr(12288)))
    for i in range(20):
        print(tplt.format(i+1,itemsi,itemsi),chr(12288))
def main():
    url='https://y.qq.com/n/ryqq/toplist/4';
    html=Get_HTML(url)
    items=ParsePage(html)
    Print(items)
main()

re和pyquery练习(爬取1905电影网)

正则表达式
import requests
import re
import json
from lxml import etree
from bs4 import BeautifulSoup
from pyquery import PyQuery as pq
"获取html文档"
def Get_HTML(url):
headers={'User-Agent':'Mozilla/5.0'}
try:
    r=requests.get(url,headers=headers)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    return r.text
except:
    print("Error!")
"设置正则表达式规则,获取信息"
def parse_pages(html):
pattern=re.compile('<dl.?cl">.?nob.?>(.?)</b>.?class="li03 oh".?href="(.?)".?class=" pl28">(.?)</a>.?<span>.?title=.?>(.?)</a>.?title=.?>(.?)</a>.?title=.?>(.?)</a>.?class="li05 ta_c".?<span>(.?)</span>.*?</dl>',re.S)
items=re.findall(pattern,html)
for item in items:
    yield{
        'index':item[0],
        'image':item[1],
        'title':item[2],
        'actor':item[3:6],
        'score':item[6]
        } 
def main():
url='https://www.1905.com/vod/top/lst/';
html=Get_HTML(url)
for item in parse_pages(html):
    print(item)
    #Write_to_file(item) 
main()

pyquery
from pyquery import PyQuery as pq
import requests
import re
import json

def Get_HTML(url):
    headers = {'User-Agent': 'Mozilla/5.0'}
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("Error!")

def parse_page(html):
    doc=pq(html)
    title=doc('.li03 a').text().split(' ')  #名称
    actor=doc('.li04 span').text().split(' ')  #演员表
    index=doc('.li01 b').text().split(' ')     #序号
    href=[]  #链接
    for i in doc('.li03 a').items():  #遍历
        href.append(i.attr('href'))
    score=doc('.li05 span').text().split(' ')  #评分
    Result={}
    for i in range(100):
        result={
            '序号':index[i],
            '名称':title[i],
            '链接':href[i],
            '演员':actor[i],
            '评分':score[i]
        }
        Result[index[i]]=result
    return Result
def write_to_file(item):
    with open('1905电影排行榜.txt', 'a+', encoding='UTF-8') as f:
        f.write(json.dumps(item, ensure_ascii=False) + '\n')
def main():
    url = 'https://www.1905.com/vod/top/lst/'
    html = Get_HTML(url)
    item=parse_page(html)
    for i in range(1,len(item)+1):
        write_to_file(item[str(i)])

main()