DFS题目总结
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DFS题目总结相关的知识,希望对你有一定的参考价值。
DFS顺序很重要!
模板题
acw-排列数字
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10;
int n;
int v[N],path[N];
void dfs(int u)
{
if(u>n)
{
for(int i=1;i<=n;i++)
{
cout<<path[i];
if(i!=n) cout<<" ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(!v[i])
{
path[u]=i;
v[i]=1;
dfs(u+1);
v[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
n-皇后问题
843. n-皇后问题
关于正对角线和反对角线的表示:
n皇后问题——关于斜线的编号
如果出现x+y==某个常数,那么它们就在一条对角线上了。
+n是因为数组下标不能为负,加的一个参数而已。
优化过的(剪枝):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10;
int n;
char g[N][N];
int lie[N],zdj[N],fdj[N];
void dfs(int u)//u是行 每行只能有一个
{
if(u==n)//结束
{
for(int i=0;i<n;i++) cout<<g[i]<<endl;
cout<<endl;
return;
}
for(int i=0;i<n;i++)
{
if(!lie[i]&&!zdj[u+i]&&!fdj[n-u+i])
{
g[u][i]='Q';
lie[i]=1;
zdj[u+i]=1;fdj[n-u+i]=1;
dfs(u+1);//下一行
g[u][i]='.';//恢复现场
lie[i]=0;
zdj[u+i]=0;fdj[n-u+i]=0;
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
g[i][j]='.';
}
}
dfs(0);
return 0;
}
没优化的:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=25;
char g[N][N];
int hang[N],lie[N],dj[N],fdj[N];
int n;
void dfs(int x,int y,int s)//(x,y) s皇后个数
{
if(y==n) y=0,x++;
if(x==n)
{
if(s==n) //放满皇后
{
for(int i=0;i<n;i++) cout<<g[i]<<endl;
cout<<endl;
}
return;
}
//放
if(!hang[x]&&!lie[y]&&!dj[x+y]&&!fdj[n-y+x])
{
hang[x]=lie[y]=dj[x+y]=fdj[n-y+x]=1;
g[x][y]='Q';
dfs(x,y+1,s+1);
hang[x]=lie[y]=dj[x+y]=fdj[n-y+x]=0;
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;
}
简单
图像渲染
图像渲染
也类似模板题了。
注意:
- 范围,要大于0小于size;
- 刚开始时要新的颜色和旧的颜色不一样才开始遍历
class Solution {
public:
int d1[4]={0,0,1,-1};
int d2[4]={1,-1,0,0};
void dfs(vector<vector<int>>& image, int sr, int sc, int newColor,int oldC)
{
if(image[sr][sc]==oldC) image[sr][sc]=newColor;
else return;
for(int i=0;i<4;i++)
{
int x=sr+d1[i],y=sc+d2[i];
if(x<image.size()&&y<image[0].size()&&x>=0&&y>=0)
{
if(image[x][y]==oldC) dfs(image,x,y,newColor,oldC);
}
}
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
int oldC=image[sr][sc];
if(oldC!=newColor) dfs(image,sr,sc,newColor,oldC);
return image;
}
};
中等
岛屿的最大面积
岛屿的最大面积
也是模板题。
class Solution {
public:
int v[55][55];
int dfs(vector<vector<int>>& grid,int x,int y)
{
int temp=0;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
if(!v[x][y])
{
v[x][y]=1;
if(grid[x][y])
{
temp++;
for(int i=0;i<4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx>=0&&tx<grid.size()&&ty>=0&&ty<grid[0].size())
{
temp+=dfs(grid,tx,ty);
}
}
}
}
return temp;
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
memset(v,0,sizeof(v));
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!v[i][j])
{
ans=max(ans,dfs(grid,i,j));
}
}
}
return ans;
}
};
以上是关于DFS题目总结的主要内容,如果未能解决你的问题,请参考以下文章