【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】
任务说明:搜索可以穷举各种情况。很多题目都可以用搜索完成。就算不能,搜索也是骗分神器。
P1219 八皇后
直接dfs。对角线怎么判断:同一条对角线的横纵坐标的和或者差相同。
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cmath> using namespace std; static int total = ;
vector<vector<int>> ans; void print(int t, vector<vector<bool>>& chess) {
printf("the %dth answer\n", t);
for(int i = ; i < chess.size(); ++i) {
for(int j = ; j < chess[i].size(); ++j) {
//printf("%d", chess[i][j]);
cout << chess[i][j];
}
printf("\n");
}
} void print(int t, vector<int>& current_ans) {
//printf("the %dth answer\n", t);
printf("%d", current_ans[]);
for(int i = ; i < current_ans.size(); ++i) {
printf(" %d", current_ans[i]);
}
printf("\n");
} void queuens(vector<vector<bool>>& chess, int i, const int N,
vector<int>& cols, vector<int>& diagnals, vector<int>& anti_diagnals,
vector<int>& current_answer) {
if (i == N) {
total++;
if (total <= ) {
print(total, current_answer);
}
return;
}
for(int col = ; col < N; ++col) {
if(cols[col] == && anti_diagnals[i-col+N] == && diagnals[i+col] == ) {
cols[col] = ; anti_diagnals[i-col+N] = ; diagnals[i+col] = ;
current_answer[i] = col+;
queuens(chess, i+, N, cols, diagnals, anti_diagnals, current_answer);
cols[col] = ; anti_diagnals[i-col+N] = ; diagnals[i+col] = ;
current_answer[i] = ;
}
}
} int main() {
int N;
cin >> N;
vector<vector<bool>> chess(N, vector<bool>(N, false));
vector<int> diagnals(*N-, );
vector<int> anti_diagnals(*N-, );
vector<int> cols(N, );
vector<int> current_answer(N, );
queuens(chess, , N, cols, diagnals, anti_diagnals, current_answer);
printf("%d\n", total);
return ;
}
P1019 单词接龙
做的时候没写题解,结果现在忘记了。。。orz
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <utility>
#include <string>
#include <cstring>
#include <vector>
using namespace std; typedef pair<string, int> P;
static int maxans = ; void print (vector<string>& vecStr) {
printf("vector dragon\n");
for(auto ele : vecStr) {
printf("%s ", ele.c_str());
}
printf("\n");
} void dfs(int level, vector<P>& vecWord, int& ans, vector<string>& dragon)
{
string lastWord = dragon[level-];
//printf("info for debug: level[%d] \n", level);
//printf("lastWord[%s]", lastWord.c_str());
//print(dragon); for (int i = ; i < vecWord.size(); ++i) {
if(vecWord[i].second < ) {
string curWord = vecWord[i].first;
int startIdx;
if (level == ) { startIdx = ; }
else {startIdx = ;}
for (int j = lastWord.size() - ; j >= startIdx; --j) {
string lssubstr = lastWord.substr(j);
if (curWord.find(lssubstr) != || curWord == lssubstr) { continue; }
vecWord[i].second++;
dragon[level] = curWord;
ans += curWord.size() - lssubstr.size();
if (ans > maxans) {maxans = ans;}
dfs(level+, vecWord, ans, dragon);
dragon[level] = "";
vecWord[i].second--;
ans -= curWord.size() - lssubstr.size();
}
}
}
} int main() {
int n;
cin >> n;
vector<P> vecWord(n);
for(int i = ; i < n; ++i) {
string str;
cin >> str;
P p;
p.first = str;
p.second = ;
vecWord[i] = p;
}
vector<string> vecDragon(*n+);
string strDragon;
cin >> strDragon; vecDragon[] = strDragon;
int ans = ;
dfs(, vecWord, ans, vecDragon);
cout << maxans << endl;
return ;
}
P1101 单词方阵
就是在一个字母方阵中画出 “yizhong” 这个单词,八种方向都ok,但是一旦选定了方向,就不能换了。
如图:
解法:我的解法就是用一个相同的布尔方阵去决定这个字母是否显示,dfs决定use方阵的01。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <utility>
#include <string>
#include <cstring>
#include <vector>
using namespace std; string pattern = "yizhong"; void print (vector<vector<char>>& chess, vector<vector<bool>>& use) {
for(int i = ; i < chess.size(); ++i) {
for (int j = ; j < chess.size(); ++j) {
if (use[i][j]) { printf("%c", chess[i][j]);}
else { printf("*"); }
}
printf("\n");
}
} bool dfs(vector<vector<char>>& chess, vector<vector<bool>>& use, int level, const int addx, const int addy, int x, int y) {
if (level == ) {
return true;
}
if (x+addx >= && x+addx < chess.size() && y+addy >= && y+addy < chess.size()) {
if (pattern[level] == chess[x+addx][y+addy]) {
bool ans = dfs(chess, use, level+, addx, addy, x+addx, y+addy);
if (ans) {
use[x+addx][y+addy] = ans;
}
return ans;
}
else {
return false;
}
} else {
return false;
}
} void findword(vector<vector<char>>& chess, vector<vector<bool>>& use, int x, int y) {
for(int addx = -; addx <= ; ++addx) {
for(int addy = -; addy <= ; ++addy) {
if (addx == && addy == ) { continue; }
if (x+addx >= && x+addx < chess.size() && y+addy >= && y+addy < chess.size()) {
bool ans = dfs(chess, use, , addx, addy, x, y);
if (ans) {
use[x][y] = ans;
}
}
}
} } int main() {
int n;
cin >> n;
vector<vector<char>> chess(n, vector<char>(n)); int x = -, y = -;
for(int i = ; i < n; ++i) {
for (int j = ; j < n; ++j) {
cin >> chess[i][j];
if (chess[i][j] == 'y' && x == - && y == -) {
x = i, y = j;
}
}
}
vector<vector<bool>> use(n, vector<bool>(n, false));
if (x == - && y == -) {
print(chess, use);
return ;
} for(int i = ; i < chess.size(); ++i) {
for(int j = ; j < chess[].size(); ++j) {
if (chess[i][j] == 'y') {
findword(chess, use, i, j);
}
}
}
print(chess, use); return ;
}
P1605 迷宫
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
解答: 我是直接dfs, 爆搜出来的...题面只给了坐标,需要用坐标复现出棋盘的样子,然后爆搜就好
第一次提交70分, 原因在于 迷宫的起点也不能重复通过。
//initialize chess,
//state = 0 can go
//state = -1 obstacle
//state = 1 visited
//1605
//第一次提交70分, 问题在于迷宫起点也不能重复通过 #include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cmath> using namespace std; static int ans = ;
int n, m, t;
int sx, sy, dx, dy; int addx[] = {, -, , };
int addy[] = {-, , , }; void print(const vector<vector<int>>& chess) {
printf("======begin debug=======\n");
for(int i = ; i < chess.size(); ++i) {
for(int j = ; j < chess[].size(); ++j) {
printf("%d ", chess[i][j]);
}
printf("\n");
}
printf("=======end==============\n");
} void dfs(vector<vector<int>>& chess, int x, int y) {
if (x == dx && y == dy) {
++ans;
return;
}
for(int i = ; i < ; ++i) {
int newx = x + addx[i], newy = y + addy[i];
if(newx > && newx <= n && newy > && newy <= m && chess[newx][newy] != - && chess[newx][newy] != ) {
chess[newx][newy] = ;
dfs(chess, newx, newy);
chess[newx][newy] = ;
}
}
} int main() { cin >> n >> m >> t;
cin >> sx >> sy >> dx >> dy;
//initialize chess,
//state = 0 can go
//state = -1 obstacle
//state = 1 visited vector<vector<int>> chess(n+, vector<int>(m+, ));
for(int i = ; i < m+; ++i) {
chess[][i] = -;
}
for (int i = ; i < n+; ++i) {
chess[i][] = -;
}
while(t--) {
int x, y;
cin >> x >> y;
chess[x][y] = -;
}
//print(chess);
chess[sx][sy] = ; //start point can not repeat pass
dfs(chess, sx, sy); cout << ans << endl;
return ;
}
【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】的更多相关文章
- 【Luogu】【关卡2-6】贪心(2017年10月)
任务说明:贪心就是只考虑眼前的利益.对于我们人生来说太贪是不好的,不过oi中,有时是对的. P1090 合并果子 有N堆果子,只能两两合并,每合并一次消耗的体力是两堆果子的权重和,问最小消耗多少体力. ...
- 【Luogu】【关卡2-3】排序(2017年10月) 【AK】
任务说明:将杂乱无章的数据变得有规律.有各种各样的排序算法,看情况使用. 这里有空还是把各种排序算法总结下吧.qsort需要会写.. P1177 [模板]快速排序 这个题目懒得写了,直接sort了.. ...
- 欢迎来怼-Alpha周(2017年10月19)贡献分配规则和分配结果
.从alpha周(2017年10月19日开始的2周)开始,提高贡献分比重. 贡献分 : 团队分 = 1 : 5 教师会在核算每位同学总分时按比例乘以系数. 每位同学带入团队贡献分10分,如果团队一共7 ...
- 2017年10月31日结束Outlook 2007与Office 365的连接
2017 年10月31日 ,微软即将推出 Office 365中Exchange Online邮箱将需要Outlook for Windows的连接,即通过HTTP Over MAPI方式,传统使用R ...
- 江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告
编者按:当人们在做技术创新时,我们在做“外包产业“:当人们在做制造产业,我们在做”服务产业“:江人们在做AI智能时,我们在做”物联网“崛起,即使有一个落差,但红色热土从不缺少成长激情. 本期摘自上月初 ...
- 【Luogu】【关卡2-9】带有技巧的搜索(2017年10月)
任务说明:这里的搜索不仅包含了dfs和bfs,还包括剪枝.记录等技巧以加快速度. [USACO06FEB]数字三角形Backward Digit Su… 滑雪 吃奶酪 靶形数独 P1118 [USAC ...
- 【Luogu】【关卡2-8】广度优先搜索(2017年10月)
任务说明:广度优先搜索可以用来找有关“最短步数”的问题.恩,也可以用来“地毯式搜索”.
- 【Luogu】【关卡1-8】BOSS战-入门综合练习2(2017年10月)【AK】------都是基础题
P1426 小鱼会有危险吗 我个人觉得这个题目出的不好,没说明白,就先只粘贴的AC代码吧 #include <bits/stdc++.h> using namespace std; int ...
- 【Luogu】【关卡2-16】线性动态规划(2017年10月)【还差三道题】
任务说明:这也是基础的动态规划.是在线性结构上面的动态规划,一定要掌握. P1020 导弹拦截 导弹拦截 P1091 合唱队形 老师给同学们排合唱队形.N位同学站成一排,音乐老师要请其中的(N-K)位 ...
随机推荐
- 分支结构if 语句举例
- Rxjava Retrofix2 okhttp3网络框架自解(转)
直接代码 类一 public class Okhttp3Utils { private static OkHttpClient mOkHttpClient; public static OkHttpC ...
- Linux xargs 命令
xargs xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具. xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据. xargs 也可 ...
- diff算法(核心)
ps:大致转载知乎文章 vue和react的虚拟dom都采用类似的diff算法,核心大概可以归为两点 1,两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构: 2,同一层级的一组节点, ...
- k8s--网络模式
1.clusterip kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: nginx ports ...
- 修改jquery默认的$
一.使用JQuery.noConflict() 该方法的作用就是让Jquery放弃对$的所有权,将$的控制权交还给prototype.js,因为jquery.js是后引入的,所以最后拥有$控制权的是j ...
- loadRunner之参数关联
录制脚本,对用户名和密码进行参数化: Action() { web_url("WebTours", "URL=http://127.0.0.1:1080/WebTours ...
- 怎么让小白理解intel处理器(CPU)的分类
https://www.zhihu.com/question/32669957 目录 如何选购台式机CPU? 1. 英特尔处理器简介(本文) 1.1 聊聊Intel Tick-Tock 2. AMD处 ...
- VMware Hyper-V不兼容
VMware Workstation Windows系統的Hyper-V不相容 禁用Device Guard或Credential Guard 1. 以管理員身份運行Windows Powershel ...
- 97、PageRank算法学习
最近由于.......你懂得,需要一些搜索方面的知识,于是乎我重新复习了一下上半年读的那本书<数学之美>Dr吴军老师写的. 感觉读完这种书还是写一下比较好,因为将来说不定就会忘记了. 接下 ...