1.N皇后问题

2.油田问题

3.素数环问题

4.马踏棋盘问题

5.图的m着色问题

6.01背包问题

7.TSP问题

【Code-1:输出N皇后方案和个数】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 105;
const ll INF = 2147483647;
typedef pair<ll ,int> pli;
int a[maxn],b[maxn],c[maxn],mp[maxn][maxn];
int n,cnt;
void print()
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%d ",mp[i][j]);
printf("\n");
} }
int dfs(int i)
{
for(int j=1;j<=n;j++)
{
if(!a[j] && !b[i-j+n] && !c[i+j])
{
mp[i][j]=i;
a[j]=b[i-j+n]=c[i+j]=1; if(i==n)
{
print();
printf("\n");
cnt++;
}
else
{
dfs(i+1);
} mp[i][j]=0;
a[j]=b[i-j+n]=c[i+j]=0;
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);
printf("%d\n",cnt);
}

【HDU-2553-N皇后输出方案数/预处理打表】:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 105;
const ll INF = 2147483647;
typedef pair<ll ,int> pli;
int a[maxn];
int cnt=0;
int vis[3][maxn];
int n;
void dfs(int i)
{
if(i==n+1)
{
cnt++;
return ;
}
for(int j=1;j<=n;j++)
{
if(!vis[0][i-j+n] && !vis[1][j] && !vis[2][i+j])
{
vis[0][i-j+n] = vis[1][j] = vis[2][i+j] = 1;
dfs(i+1);
vis[0][i-j+n] = vis[1][j] = vis[2][i+j] = 0;
}
}
} int main()
{
for(n=1;n<=10;n++)
{
memset(vis,0,sizeof(vis));
cnt=0;
dfs(1);
a[n]=cnt;
}
while(~scanf("%d",&n),n)
{
printf("%d\n",a[n]);
} }

【Code-2】:HDU 1241

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 105;
const ll INF = 2147483647;
typedef pair<ll ,int> pli;
//int dir[8][2]={ {0,1},{1,-1},{-1,0},{-1,-1},{-1,0},{-1,1},{0,1},{1,1} };
int dir[8][2]={1,0,-1,0,0,1,0,-1,1,1,-1,-1,1,-1,-1,1};
char mp[maxn][maxn];
int n,m;
int ok(int x,int y)
{
if(x>=0 && y>=0 && x<n && y<m && mp[x][y]=='@')
return 1;
return 0;
}
void dfs(int x, int y)
{
mp[x][y]='*';//把找到的@变为*,以免重复搜索
for(int i=0;i<8;i++)
{
x=x+dir[i][0];
y=y+dir[i][1];
if(ok(x,y))
{
dfs(x,y);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m),n&&m)
{
//getchar();
int cnt=0;
for(int i=0;i<n;i++)
{
scanf("%s",mp[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mp[i][j]=='@')
{
dfs(i,j);
cnt++;
}
}
}
printf("%d\n",cnt);
}
}
/*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
*/

【Code-3-素数环】:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 105;
const ll INF = 2147483647;
typedef pair<ll ,int> pli;
int n,cnt;
int vis[maxn];
bool isp(int n)
{
if(n<=1) return 0;
else
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0) return 0;
}
}
return 1;
}
int a[maxn];
/*
int print()
{
cnt++;
//printf("(%d)\n",cnt);
for(int j=1;j<=n;j++)
printf("%d ",a[j]);
printf("\n");
}
*/
void dfs(int cur)
{ if(cur>n && isp(a[1]+a[n]))
{
cnt++;
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
else
{
for(int i=1;i<=n;i++)
{
if(vis[i]==0 && isp(i+a[cur-1]))
{
a[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
}
} int main()
{
scanf("%d",&n);
memset(a,0,sizeof(a));
dfs(1);
printf("Total sum is %d\n",cnt);
}

【Code-4-骑士周游】:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 50;
const ll INF = 2147483647;
typedef pair<ll ,int> pli; int n,m;
int cnt;
int vis[maxn][maxn];
int fx[8]={-1,1,-2,2,-2,2,-1,1};
int fy[8]={-2,-2,-1,-1,1,1,2,2};
int a[maxn][maxn];
int f=0;
struct node
{
int x,y;
node(int a=0,int b=0):x(a),y(b){}
}path[maxn]; int ok(int x,int y)
{
if(x>=1 && y>=1 && x<=n && y<=m && !vis[x][y] && !f)
return 1;
return 0;
} void print()
{
for(int i=1;i<=n*m;i++){
int x=path[i].x;
int y=path[i].y;
printf("%d %d\n",y,x); //输出坐标
}
}
void dfs(int x, int y, int d)
{
path[d]=node(x,y);
if(d==n*m)
{
f=1;
return ;
}
for(int i=0;i<8;i++)
{
int xx=x+fx[i];
int yy=y+fy[i];
if(ok(xx,yy))
{
vis[xx][yy]=1;
dfs(xx,yy,d+1);
vis[xx][yy]=0;
}
} }
int main()
{
f=0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
vis[1][1]=1;
dfs(1,1,1);
if(!f) puts("No");
else print();
}

【Code-5:洛谷-图的m着色问题】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 50;
const ll INF = 2147483647;
typedef pair<ll ,int> pli; int n,m;
int a[maxn][maxn],c[maxn];
int sum=0; int ok(int i)
{
for(int j=1;j<=n;j++)
{
if(a[i][j] && c[i]==c[j])
return 0;
}
return 1;
} void dfs(int cur)
{
if(cur==n+1)
{
sum++;
for(int i=1;i<=n;i++)
printf("%d ",c[i]);
printf("\n");
return ;
}
else
{
for(int i=1;i<=m;i++)
{
c[cur]=i;
if(ok(cur))
{
dfs(cur+1);
}
c[cur]=0;
}
}
} int main()
{
int x,y,k;
scanf("%d%d%d",&n,&k,&m);
while(k--)
{
scanf("%d%d",&x,&y);
a[x][y]=a[y][x]=1;
}
dfs(1);
if(!sum) puts("No");
else printf("%d\n",sum);
}
/*
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5 48
*/

【Code6-01背包回溯版】:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2*1e5+5;
const ll INF = 2147483647;
typedef pair<ll ,int> pli; //int v[maxn],w[maxn];
int n,c,cp,bestp;//物品数、背包大小、当前价值、最优价值
int x[maxn],bestx[maxn];//当前解、最优解
struct node
{
int v,w;//价值、重量
}a[maxn];
bool cmp(node a, node b)
{
return a.v*b.w > b.v*a.w;
}
void print()
{
for(int i=0;i<n;i++)
printf("%d ",bestx[i]);
printf("\n"); return ;
}
void dfs(int cur)
{
if(cur>=n)
{
if(bestp<cp)
bestp=cp;
for(int i=0;i<n;i++)
bestx[i]=x[i];
//print();
}
else
{
if(a[cur].w <= c)
{
x[cur]=1; cp+=a[cur].v; c-=a[cur].w;
dfs(cur+1);
x[cur]=0; c+=a[cur].w; cp-=a[cur].v;
}
x[cur]=0;
dfs(cur+1);
}
} int main()
{
scanf("%d%d",&n,&c);
for(int i=0;i<n;i++)
scanf("%d",&a[i].v);
for(int i=0;i<n;i++)
scanf("%d",&a[i].w);
sort(a,a+n,cmp);
dfs(0);
printf("%d\n",bestp);
}
/*
5 10
6 3 6 5 4
2 2 4 6 5 最优价值 15
放入 1 2 3 3 30
16 10 13
45 20 25
*/

【输出路径版】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2*1e5+5;
const ll INF = 2147483647;
typedef pair<ll ,int> pli; int w[maxn];
int v[maxn];
int best_ans[maxn], ans[maxn];
int cw, cv, n, max_w, max_v ;
void print()
{
printf("%d\n",max_v);
for(int i=0;i<n;i++)
printf("%d ",best_ans[i]);
printf("\n");
} void DFS(int step,int cw,int cv)
{
if(step>=n)
{
if(cv > max_v)
{
max_v = cv;
for(int i=0;i<n;i++)
best_ans[i] = ans[i];
}
}
else
{
if(cw >= w[step])
{
ans[step] = 1; cv += v[step]; cw -= w[step];
DFS(step+1,cw,cv);
ans[step] = 0; cv -= v[step]; cw += w[step];
}
ans[step]=0;
DFS(step+1,cw,cv);
}
} void init()
{
max_v = 0;
for(int i=0;i<n;i++)
ans[i] = 0;
max_v = 0;
} int main()
{
while(scanf("%d%d",&n,&max_w)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
for(int j=0;j<n;j++)
scanf("%d",&w[j]);
init();
DFS(0,max_w,0);
print();
}
return 0;
}
/*
5 10
6 3 6 5 4
2 2 4 6 5 */

回溯法练习【BFS/DFS】的更多相关文章

  1. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  2. LeetCode刷题总结-DFS、BFS和回溯法篇

    本文总结LeetCode上有关深度优先搜索(DFS).广度优先搜索(BFS)和回溯法的算法题,推荐刷题总数为13道.具体考点分析如下图: 一.深度优先搜索 1.字符匹配问题 题号:301. 删除无效的 ...

  3. UVA - 524 Prime Ring Problem(dfs回溯法)

    UVA - 524 Prime Ring Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & % ...

  4. P1378 油滴扩展 dfs回溯法

    题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...

  5. P1074 靶形数独 dfs回溯法

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...

  6. P1605 迷宫 dfs回溯法

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  7. 回溯法、DFS

    回溯法 为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回上一步重新选择条件,继续向前探索,如此反复进行,直至得到解或证明无解. DFS DFS模板 vo ...

  8. 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)

    1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...

  9. 剑指offer:机器人的运动范围(回溯法DFS)

    题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...

  10. POJ 2488 A Knight's Journey (回溯法 | DFS)

    题目链接:http://poj.org/problem?id=2488 题意: 在国际象棋的题盘上有一个骑士,骑士只能走“日”,即站在某一个位置,它可以往周围八个满足条件的格子上跳跃,现在给你一个p ...

随机推荐

  1. IHE PIX规范

    IHE(Integrating Healthcare Enterprise) 集成医疗企业 IHE概念是由医学专家和广大医护工作者.相关政府部门.信息技术专家和企业共同发起的,目的是提供一种更好的方法 ...

  2. 从零开始学习MXnet(四)计算图和粗细粒度以及自动求导

    这篇其实跟使用MXnet的关系不大,但对于我们理解深度学习的框架设计还是很有帮助的. 首先还是对promgramming models的一个简单介绍,这个东西实际上是在编译里面经常出现的东西,我们在编 ...

  3. HDU4725:The Shortest Path in Nya Graph(最短路)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  4. codeforces 1015B

    B. Obtaining the String time limit per test 1 second memory limit per test 256 megabytes input stand ...

  5. 停止ambari上服务的顺序

    Before performing any upgrades or uninstalling software, stop all of the Hadoop services in the foll ...

  6. MFC 对话框透明效果

    网上找的资料自己改了改,在这里记录和分享一下,主要是TransparentWnd函数. 在子类的OnShowWindow函数中调用 ShowWindowAlpha() #pragma once tem ...

  7. BroadCastRecieve

    首先介绍一下BroadCastRecieve有几种: 1.无序广播(普通广播):sendBroadcast()方式 2.有序广播:sendOrderedBroadcast()方式 3.粘性广播:sen ...

  8. Extjs3.4 合并单元格

    Ext3.4合并单元格   表格上添加grid-row-span样式

  9. Kuangbin 带你飞-线段树专题 题解

    HDU 1166 敌兵布阵 单调更新区间查询和 #include <map> #include <set> #include <list> #include < ...

  10. js 触发LinkButton点击事件,执行后台方法

    页面 <asp:LinkButton ID="lbtButton" runat="server"  CssClass="lbtButton&qu ...