一、每日一题
今天每日一题很简单,简单模拟就行,记一下代码。
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);
}