任务说明:搜索可以穷举各种情况。很多题目都可以用搜索完成。就算不能,搜索也是骗分神器。

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】【题解没写完】的更多相关文章

  1. 【Luogu】【关卡2-6】贪心(2017年10月)

    任务说明:贪心就是只考虑眼前的利益.对于我们人生来说太贪是不好的,不过oi中,有时是对的. P1090 合并果子 有N堆果子,只能两两合并,每合并一次消耗的体力是两堆果子的权重和,问最小消耗多少体力. ...

  2. 【Luogu】【关卡2-3】排序(2017年10月) 【AK】

    任务说明:将杂乱无章的数据变得有规律.有各种各样的排序算法,看情况使用. 这里有空还是把各种排序算法总结下吧.qsort需要会写.. P1177 [模板]快速排序 这个题目懒得写了,直接sort了.. ...

  3. 欢迎来怼-Alpha周(2017年10月19)贡献分配规则和分配结果

    .从alpha周(2017年10月19日开始的2周)开始,提高贡献分比重. 贡献分 : 团队分 = 1 : 5 教师会在核算每位同学总分时按比例乘以系数. 每位同学带入团队贡献分10分,如果团队一共7 ...

  4. 2017年10月31日结束Outlook 2007与Office 365的连接

    2017 年10月31日 ,微软即将推出 Office 365中Exchange Online邮箱将需要Outlook for Windows的连接,即通过HTTP Over MAPI方式,传统使用R ...

  5. 江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告

    编者按:当人们在做技术创新时,我们在做“外包产业“:当人们在做制造产业,我们在做”服务产业“:江人们在做AI智能时,我们在做”物联网“崛起,即使有一个落差,但红色热土从不缺少成长激情. 本期摘自上月初 ...

  6. 【Luogu】【关卡2-9】带有技巧的搜索(2017年10月)

    任务说明:这里的搜索不仅包含了dfs和bfs,还包括剪枝.记录等技巧以加快速度. [USACO06FEB]数字三角形Backward Digit Su… 滑雪 吃奶酪 靶形数独 P1118 [USAC ...

  7. 【Luogu】【关卡2-8】广度优先搜索(2017年10月)

    任务说明:广度优先搜索可以用来找有关“最短步数”的问题.恩,也可以用来“地毯式搜索”.

  8. 【Luogu】【关卡1-8】BOSS战-入门综合练习2(2017年10月)【AK】------都是基础题

    P1426 小鱼会有危险吗 我个人觉得这个题目出的不好,没说明白,就先只粘贴的AC代码吧 #include <bits/stdc++.h> using namespace std; int ...

  9. 【Luogu】【关卡2-16】线性动态规划(2017年10月)【还差三道题】

    任务说明:这也是基础的动态规划.是在线性结构上面的动态规划,一定要掌握. P1020 导弹拦截 导弹拦截 P1091 合唱队形 老师给同学们排合唱队形.N位同学站成一排,音乐老师要请其中的(N-K)位 ...

随机推荐

  1. windows自动关机(任务计划程序 + exe文件)

    需求:windows系统自动关机 的需求: 相关工具:win10系统中,使用windows自带的任务计划程序 和 windows自带的关机 exe文件 完成此需求 exe文件位置:C:\Windows ...

  2. python模块打补丁

    先自定义两个模块,然后,我们调用模块时,用打补丁方式,改写mod_1.py模块.为mod_2.py内容:其实这就相当于,在不改动mod_1.py模块的前提下,打上补丁. 写这个主要是gevent协程的 ...

  3. ThreadLocal简单使用示例

    ThreadLocal为每个线程提供单独的数据副本,线程间的数据为自身线程所独有(不存在共享变量问题),直接看代码 public class ThreadLocalTest { private sta ...

  4. python 读取文件时,精确的保留数据

    import numpy as npimport pandas as pd point = pd.read_csv('waypoint21.csv') with pd.option_context(' ...

  5. Solr安装步骤 + dataimport导入数据配置

    一:安装solr服务器 1.导入安装包到 /usr/local/solr/singleSolr目录下 解压tomat命令:tar -zxvf apache-tomcat-7.0.47.tar.gz 解 ...

  6. python3 实现简单ftp服务功能(客户端)

    转载请注明出处! 可执行的命令: lspwdcd put rm get mkdir 上传下载,显示进度百分比以及平均上传下载速度 客户端 main代码: #Author by Andy #_*_ co ...

  7. magento 站内优化和站外优化详解

    关于Magento如何如何我就不做评论了,一句话,谁用谁知道,搜索了下,百度和谷歌中文里还真没有一篇系统的关于magento seo的内容,花了一个上午的时间,稍微整理了一下,算是给新人一个指引吧.主 ...

  8. hdu 3572 Task Schedule (Dinic模板)

    Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...

  9. sql 基础语法 alter用法和视图,透视

    --查询没有被删除的学生 alter table StuInfo --修改列属性 alter column isdelete bit null alter table StuInfo --删除列 dr ...

  10. IP地址的定义和划分

    IP地址分类:                IP地址根据首首字节开始位可以分为5大类:             分类        首字节开始位         首字节数字范围           ...