力扣寒假刷题笔记(4)1.25 简单模拟,图论复习

一、每日一题

今天每日一题很简单,简单模拟就行,记一下代码。

class Solution {
public:
    int numberOfMatches(int n) {
        int ans=0,res=0;
        while(n>1)
        {
            ans += n / 2;
            res = n % 2;
            n = n/2 + res;
        }
        return ans;
    }
};

第二种写法就是简单脑筋急转弯,每次比赛唰掉一个队伍,最后剩下一支队伍,要淘汰n-1支队伍,就需要n-1场比赛,直接返回n-1即可。

class Solution {
public:
    int numberOfMatches(int n) {
        return n-1;
    }
};

二、图论知识点复习

(1)dfs和bfs

DFS 使用数据结构是栈(stack),空间O(h),跟树高成正比,因为每次只需要记录一条路

BFS 使用数据结构是队列(queue),空间O(2^h),每次需要记录每一层的点。

同时,BFS每次只向下扩展一个点,所以第一次搜索到的点一定是最近的点(假设每一条边的权重都是1),可以用来求最短路,DFS不具有这个性质。由此衍生出昨天每日一题除了对优化dijkstra算法以外的另一个思路,待会补上。

//DFS
#include <iostream>
using namespace std;
const int N=10;
int path[N];
bool st[N];
int n;
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++) cout<<path[i]<<" ";
        cout<<"\n";
    }
    for(int i=1;i<=n;i++)
    {
        if(!st[i])
        {
            path[u] = i;
            st[i] = true;
            dfs(u+1);
            st[i] = false;
        }
    }
}
int main()
{
    cin>>n;
    dfs(0);
}
//DFS解决N皇后问题 第一种解法
#include <iostream> 
#include <cstring>
using namespace std;
const int N=10;
char g[N][N];
bool row[N],col[N],udg[2*N],dg[2*N];
int n;
void dfs(int x,int y,int s)
{
    if(y==n) y=0,x++;
    if(x==n)
    {
        if(s==n)
        {
            for(int i=0;i<n;i++) puts(g[i]);
            puts("");
        }
        return;
    }
    if(!row[x]&& !col[y] && !dg[x+y] && !udg[x-y+n])
    {
        row[x] = col[y] = dg[x+y] = udg[x-y+n] = true;
        g[x][y] = 'Q';
        dfs(x,y+1,s+1);
        row[x] = col[y] = dg[x+y] = udg[x-y+n] = false;
        g[x][y] = '.';
    }
    dfs(x,y+1,s);
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++) g[i][j] = '.';
    }
    dfs(0,0,0);
    return 0;
}
//DFS解决N皇后问题,按行遍历 
#include <iostream>
using namespace std;
const int N=10;
char g[N][N];
bool row[N],udg[2*N],dg[2*N];
int n;
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++) puts(g[i]);
        puts("");
        return;
    }
    for(int i=0;i<n;i++)
    {
        if(!row[i] && !dg[i+u] && !udg[i-u+n])
        {
            row[i] = dg[i+u] = udg[i-u+n] = true;
            g[u][i] = 'Q';
            dfs(u+1);
            row[i] = dg[i+u] = udg[i-u+n] = false;
            g[u][i] = '.';
        }
    }
}
int main()
{
    cin >>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++) g[i][j]='.';
    }
    dfs(0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值