刷完了大力数据结构(水比数据结构专题)后又开始搞无脑搜索专题

这次的标签是DFS(这TM的到现在了谁还不会)

2488

跳马问题:给出一个棋盘,让你求一个方案使一匹马能花最短的时间不重复不遗漏地跳完整个棋盘(并要求字典序最小)

很显然,如果可以遍历,那么从任何一个点开始都可以遍历整个棋盘。因此选字典序最小的A1开始遍历,然后找一种字典序最小的搜索顺序DFS即可

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int N=30,fx[8]={-1,1,-2,2,-2,2,-1,1},fy[8]={-2,-2,-1,-1,1,1,2,2};
struct data
{
int x,y;
}next[N][N];
int t,n,m;
bool vis[N][N],flag;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void print(void)
{
int x=1,y=1; putchar(y+'A'-1); putchar(x+'0');
while (next[x][y].x!=-1&&next[x][y].y!=-1)
{
int xx=next[x][y].x,yy=next[x][y].y;
putchar(yy+'A'-1); putchar(xx+'0');
x=xx; y=yy;
}
putchar('\n');
}
inline void DFS(int x,int y,int tot)
{
if (flag) return;
if (tot==n*m) { flag=1; print(); return; }
for (register int i=0;i<8;++i)
{
int xx=x+fx[i],yy=y+fy[i];
if (xx>0&&xx<=n&&yy>0&&yy<=m&&!vis[xx][yy])
{
vis[xx][yy]=1;
next[x][y].x=xx; next[x][y].y=yy;
DFS(xx,yy,tot+1);
vis[xx][yy]=0;
next[x][y].x=next[x][y].y=-1;
}
}
}
int main()
{
register int i;
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
for (read(t),i=1;i<=t;++i)
{
read(n); read(m);
memset(vis,0,sizeof(vis));
memset(next,-1,sizeof(next));
printf("Scenario #%d:\n",i);
flag=0; vis[1][1]=1; DFS(1,1,1);
if (!flag) puts("impossible"); putchar('\n');
}
return 0;
}

3083

之前已经做过,详见

3009

打冰球,冰球打到障碍物会在它前面停下并可以重新选择方向。如果击打了冰球那么它就会一直向一个方向冲过去知道它碰到了障碍或到达中点。求最小击打次数。

因为如果超过10次就直接算做失败,因此直暴力DFS即可

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int N=25;
int map[N][N],n,m,s_x,s_y,t_x,t_y,ans;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void write(int x)
{
if (x<0) putchar('-'),x=-x;
if (x/10) write(x/10);
putchar(x%10+'0');
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void DFS(int x,int y,int tot)
{
register int i;
for (i=x-1;i>=1;--i)
if (map[i][y]==3)
{
if (tot+1<=10) ans=min(ans,tot+1); return;
} else if (map[i][y]==1)
{
if (x-i==1) break;
map[i][y]=0;
if (tot+1<=10) DFS(i+1,y,tot+1);
map[i][y]=1;
break;
}
for (i=x+1;i<=n;++i)
if (map[i][y]==3)
{
if (tot+1<=10) ans=min(ans,tot+1); return;
} else if (map[i][y]==1)
{
if (i-x==1) break;
map[i][y]=0;
if (tot+1<=10) DFS(i-1,y,tot+1);
map[i][y]=1;
break;
}
for (i=y-1;i>=1;--i)
if (map[x][i]==3)
{
if (tot+1<=10) ans=min(ans,tot+1); return;
} else if (map[x][i]==1)
{
if (y-i==1) break;
map[x][i]=0;
if (tot+1<=10) DFS(x,i+1,tot+1);
map[x][i]=1;
break;
}
for (i=y+1;i<=m;++i)
if (map[x][i]==3)
{
if (tot+1<=10) ans=min(ans,tot+1); return;
} else if (map[x][i]==1)
{
if (i-y==1) break;
map[x][i]=0;
if (tot+1<=10) DFS(x,i-1,tot+1);
map[x][i]=1;
break;
}
}
int main()
{
register int i,j;
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
read(m); read(n);
while (m&&n)
{
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
{
read(map[i][j]);
if (map[i][j]==2) s_x=i,s_y=j;
if (map[i][j]==3) t_x=i,t_y=j;
}
ans=1e9; DFS(s_x,s_y,0);
write(ans!=1e9?ans:-1); putchar('\n');
read(m); read(n);
}
return 0;
}

1321

对于这道难得的中文题目我都喜极而泣了

就注意一下‘#’才是放旗子的地方

CODE

#include<iostream>
using namespace std;
const int N=10;
char map[N][N];
bool l[N];
int n,k,ans;
inline void DFS(int now,int tot)
{
if (tot==k) { ++ans; return; }
if (now>n) return;
for (register int i=1;i<=n;++i)
if (map[now][i]!='.'&&!l[i]) l[i]=1,DFS(now+1,tot+1),l[i]=0;
DFS(now+1,tot);
}
int main()
{
register int i,j;
std::ios::sync_with_stdio(false);
cin>>n>>k;
while (n!=-1&&k!=-1)
{
for (i=1;i<=n;++i)
for (j=1;j<=n;++j)
cin>>map[i][j];
ans=0; DFS(1,0);
cout<<ans<<endl;
cin>>n>>k;
}
return 0;
}

2251

三维迷宫求最短路径

这其实是用BFS的......设六个方向的数组即可

CODE

#include<iostream>
#include<cstring>
using namespace std;
const int N=35,fx[6]={0,1,0,-1,0,0},fy[6]={1,0,-1,0,0,0},fz[6]={0,0,0,0,1,-1};
char map[N][N][N];
int q[N*N*N][3],step[N*N*N],n,m,d,s_x,s_y,s_z,t_x,t_y,t_z;
bool vis[N][N][N];
inline int BFS(int z,int x,int y)
{
int head=0,tail=1;
memset(vis,0,sizeof(vis));
step[1]=0; q[1][0]=z; q[1][1]=x; q[1][2]=y; vis[z][x][y]=1;
while (head<tail)
{
z=q[++head][0]; x=q[head][1]; y=q[head][2];
if (z==t_z&&x==t_x&&y==t_y) return step[head];
for (register int i=0;i<8;++i)
{
int zz=z+fz[i],xx=x+fx[i],yy=y+fy[i];
if (zz>0&&zz<=d&&xx>0&&xx<=n&&yy>0&&yy<=m&&map[zz][xx][yy]!='#'&&!vis[zz][xx][yy])
{
q[++tail][0]=zz; q[tail][1]=xx; q[tail][2]=yy;
step[tail]=step[head]+1; vis[zz][xx][yy]=1;
}
}
}
return -1;
}
int main()
{
register int i,j,k;
std::ios::sync_with_stdio(false);
cin>>d>>n>>m;
while (d&&n&&m)
{
for (i=1;i<=d;++i)
for (j=1;j<=n;++j)
for (k=1;k<=m;++k)
{
cin>>map[i][j][k];
if (map[i][j][k]=='S') s_z=i,s_x=j,s_y=k;
if (map[i][j][k]=='E') t_z=i,t_x=j,t_y=k;
}
int ans=BFS(s_z,s_x,s_y);
if (ans!=-1) cout<<"Escaped in "<<ans<<" minute(s)."<<endl; else cout<<"Trapped!"<<endl;
cin>>d>>n>>m;
}
return 0;
}

2049

也做过了,看这里

POJ2488&&3083&&3009&&1321&&2251&&2049的更多相关文章

  1. [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)

    对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决.比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析. 常用步骤: 第一道题目:Dung ...

  2. 【转】POJ题目分类

    初级:基本算法:枚举:1753 2965贪心:1328 2109 2586构造:3295模拟:1068 2632 1573 2993 2996 图:最短路径:1860 3259 1062 2253 1 ...

  3. CSU训练分类

    √√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...

  4. POJ 3278&&2049&&3083

    这次的题目叫图的深度&&广度优先遍历. 然后等我做完了题发现这是DFS&&BFS爆搜专题. 3278:题目是经典的FJ,他要抓奶牛.他和牛(只有一头)在一条数轴上,他们 ...

  5. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  6. POJ 3009 Curling 2.0【带回溯DFS】

    POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...

  7. 【DFS】POJ 1321

    POJ 1321 棋盘问题 题意:中文题不解释. 思路:经典DP,比较取巧的想法是一行行(按照题目意思一行最多只能放一个)来看,标记一列列.注意考虑到有些行可能不放的情况. /** Sample In ...

  8. 【BFS】POJ 2251

    POJ 2251 Dungeon Master 题意:有一个地图,三维,走的方向是上下,左右,前后.问你最小步数从起始点走到出口. 思路:三维的BFS,就是多加一组状态,需要细心(不细心如我就找了半个 ...

  9. poj 2251 Dungeon Master

    http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

随机推荐

  1. angularjs -- 页面模板清除

    前几天项目在上线过程中,出现了一些新问题.页面在切换时由于前一个页面的模板清理不及时,会造成页面的重叠.导致这个问题的原因是:页面模板缓存,即上一个页面退出时,浏览器没有及时清空上一个页面的模板,导致 ...

  2. 简单CNN 测试例

    1.训练数据: import tensorflow as tf import cv2 import os import numpy as np import time import matplotli ...

  3. SecureCRT使用问题记录

    1.破解版下载&安装 参考:https://bbs.feng.com/read-htm-tid-6939481.html 2.session导入 查看 SecureCRT-Preference ...

  4. c# 二分查找法

    1.仅 当 列表 是 有序 的 时候, 二分 查找 才 管用. 2.一般而言, 对于 包含 n 个 元素 的 列表, 用 二分 查找 最多 需要 log2n 步, 而 简单 查找 最多 需要 n 步. ...

  5. SQL Server 当表分区遇上唯一约束(转载)

    一.前言 我已经在高兴对服务器创建了表分区并且获得良好性能和自动化管理分区切换的时候,某一天,开发人员告诉我,某表的两个字段的数据不唯一,需要为这两个字段创建唯一索引的时候,这一切就变得不完美了.列的 ...

  6. php notes

    1. foreach中的引用 <?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * ...

  7. sysbench安装、使用、结果解读

    sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.目前sysbench代码托管在github上,项目地址:https://github.c ...

  8. UNIX高级环境编程(12)进程关联(Process Relationships)- 终端登录过程 ,进程组,Session

    在前面的章节我们了解到,进程之间是有关联的: 每个进程都有一个父进程: 子进程退出时,父进程可以感知并且获取子进程的退出状态. 本章我们将了解: 进程组的更多细节: sessions的内容: logi ...

  9. route命令详解与使用实例 ,同时访问内外网

    route命令详解与使用实例     2011-10-18 12:19:41|  分类: 其他 |  标签:route   |字号 订阅   1.   使用背景 需要接入两个网络,一个是部署环境所在内 ...

  10. 关于服务器端的Json文件的接收,踩了一早上的坑的问题

    JSON文件的发送和接收 服务器端接收的JSON文件也是String型的文件,因此不可以直接写成如下的格式,此错误格式下无法找到发送的{}内的数据,服务器会报错提示无法找到你需要的类型数据,也就是根本 ...