经典DFS问题实践

八皇后问题:

 1 //八皇后问题  经典的DFS问题实践
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstdio>
 6 using namespace std;
 7 int mat[8][8];
 8 int ans=0;
 9 bool check(int row,int col)//最终检查满足要求,则return 1
10 {
11     for(int i=0;i<row;i++)
12     {
13         if(mat[i][col])
14             return false;
15         for(int j=0;j<8;j++)
16         {
17             //不能在同一条对角线上
18             if(mat[i][j])
19             {
20               if(fabs(i-row)-fabs(j-col)==0)
21                  return 0;
22               else
23                  continue;
24
25             }
26         }
27     }
28     return 1;
29 }
30 int dfs(int row)
31 {
32     if(row>=8)
33     {
34         ans++;
35         for(int i=0;i<8;i++)
36         {
37             for(int j=0;j<8;j++)
38                cout<<mat[i][j]<<" ";
39             cout<<endl;
40         }
41         cout<<endl;
42     }
43     for(int col=0;col<8;col++)
44     {
45         if(check(row,col))
46         {
47             mat[row][col]=1;
48             dfs(row+1);
49             mat[row][col]=0;
50         }
51     }
52     return 0;
53 }
54 int main()
55 {
56     memset(mat,0,sizeof(mat));
57     dfs(0);
58     cout<<"一共有"<<ans<<"种解决方案"<<endl;
59 }

//最终结果显示一共有92种解决方案

时间: 2024-12-19 22:51:47

经典DFS问题实践的相关文章

HDU 1016 Prime Ring Problem --- 经典DFS

思路:第一个数填1,以后每个数判断该数和前一个数想加是否为素数,是则填,然后标记,近一步递归求解. 然后记得回溯,继续判断下一个和前一个数之和为素数的数. /* HDU 1016 Prime Ring Problem --- 经典DFS */ #include <cstdio> #include <cstring> int n; bool primer[45], visit[25]; //primer打素数表,visit标记是否访问 int a[25]; //数组a存储放置的数 /

EOJ1981 || POJ1011 经典dfs+剪枝+奇怪的数据

题目:EOJ1981 || POJ1011   经典dfs+剪枝+奇怪的数据 Description George took sticks of the same length and cut them randomly until all partsbecame at most 50 units long. Now he wants to return sticks to the originalstate, but he forgot how many sticks he had origi

LeetCode51 N皇后——经典dfs+回溯(三段式解法)

代码如下: 1 class Solution { 2 public: 3 // record[row] 该行对应的列 4 vector<vector<string> > ans; // 结果集 5 vector<vector<string>> solveNQueens(int n) { 6 string s = ""; 7 for(int i=0; i<n; i++){ 8 s += '.'; 9 } 10 vector<in

Ural1298 Knight 经典DFS

这个题目很想当时刚开始学BFS时所做的一道题目,我记得是POJ,的也是马走日 这题目就是给了你一个n * n的棋盘,从(0,0)点出发,马走日的方式,是否可以将棋盘走遍,而且每个格子只能走一次 那天先是写了bfs,但是记录方式开了个三维的,最后超时,没办法改为dfs,然后就是一直WA,或者RE实在不明白是为什么,补题已经隔了两天了,我实在没有好的办法啊,最后又敲了一次,发现过了!找 之前的代码 发现就是dir数组不一样,真奇葩,就是 走有八个方向,顺序不一样 会WA?神奇的题目 做法简单,直接D

POJ 1564 经典dfs

1.POJ 1564 Sum It Up 2.总结: 题意:在n个数里输出所有相加为t的情况. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define F(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memse

poj1564-Sum It Up(经典DFS)

给出一个n,k,再给出的n个数中,输出所有的可能使几个数的和等于k Sample Input 4 6 4 3 2 2 1 15 3 2 1 1400 12 50 50 50 50 50 50 25 25 25 25 25 250 0Sample Output Sums of 4:43+12+22+1+1Sums of 5:NONESums of 400:50+50+50+50+50+50+25+25+25+2550+50+50+50+50+25+25+25+25+25+25 明显的DFS,这个d

经典DFS问题 oilland 连通块

#include "iostream" #include "cstdio" using namespace std; int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{-1,1},{1,1},{-1,-1}}; int count,r,c; char map[100][100]; void dfs(int x,int y)//深搜函数,参数为坐标(定位) { if(x<0||y<0||x>=r||y&

poj3984(经典dfs)

题目链接:http://poj.org/problem?id=3984 分析:直接深搜从起点到终点,如何取最短路线,其实只要优先向下或向右走即可. #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include

洛谷 P1219 八皇后【经典DFS,温习搜索】

P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解.请编一个程序找出所有跳棋放置的解.并把它们以上面的序列方法输出.解按字典顺序排列.请输出前3个解.最后一行是解的总个数. //以下的