POJ2488&&3083&&3009&&1321&&2251&&2049
刷完了大力数据结构(水比数据结构专题)后又开始搞无脑搜索专题了
这次的标签是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的更多相关文章
- [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)
对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决.比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析. 常用步骤: 第一道题目:Dung ...
- 【转】POJ题目分类
初级:基本算法:枚举:1753 2965贪心:1328 2109 2586构造:3295模拟:1068 2632 1573 2993 2996 图:最短路径:1860 3259 1062 2253 1 ...
- CSU训练分类
√√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...
- POJ 3278&&2049&&3083
这次的题目叫图的深度&&广度优先遍历. 然后等我做完了题发现这是DFS&&BFS爆搜专题. 3278:题目是经典的FJ,他要抓奶牛.他和牛(只有一头)在一条数轴上,他们 ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- POJ 3009 Curling 2.0【带回溯DFS】
POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...
- 【DFS】POJ 1321
POJ 1321 棋盘问题 题意:中文题不解释. 思路:经典DP,比较取巧的想法是一行行(按照题目意思一行最多只能放一个)来看,标记一列列.注意考虑到有些行可能不放的情况. /** Sample In ...
- 【BFS】POJ 2251
POJ 2251 Dungeon Master 题意:有一个地图,三维,走的方向是上下,左右,前后.问你最小步数从起始点走到出口. 思路:三维的BFS,就是多加一组状态,需要细心(不细心如我就找了半个 ...
- poj 2251 Dungeon Master
http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
随机推荐
- Android Design Support Library(三)用CoordinatorLayout实现Toolbar隐藏和折叠
此文的代码在Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果代码的基础上进行修改,如果你没有看过本系列的第一篇文章最好先看一看.Co ...
- MemSQL 架构初探
MemSQL 自称是最快的内存数据库.目前已发布了2.5版本. MemSQL 具有以下特点 1 高效的并行,尤其是分布式的MemSQL. 2 高效的并发,采用lock-free的内存数据结构skip ...
- M5加密字符串
private string GetMD5str(string oldStr) { //将输入转换为ASCII 字符编码 ASCIIEncoding enc = new ASCIIEncoding() ...
- innodb_fast_shutdown的内幕
Innodb_fast_shutdown告诉innodb在它关闭的时候该做什么工作.有三个值可以选择:1. 0表示在innodb关闭的时候,需要purge all, merge insert buf ...
- Linux中 /proc/[pid] 目录各文件简析
Linux 内核提供了一种通过 proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系 ...
- 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
如下解决了五个问题 1. 清空数据 2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表 3. 种子问题, 如果表存在种子重设为0 ...
- linux内核完全剖析——基于0.12内核-笔记(1)-CPU 数据通信
CPU数据通信总线 CPU通过地址线.数据线.控制信号组成的本地总线(或称为内部总线)与系统其它部分进行数据通信. 地址总线 地址总线用于内存或I/O设备的地址,即指明需要读/写数据的具体位置. 数据 ...
- orcl 复杂查询
测试环境: create table bqh6 (xm varchar2(10),bmbh number(2),bmmc varchar2(15),gz int);insert into bqh6 v ...
- 俄罗斯方块(JS+CSS)
这是一个用 js + css 写的网页版俄罗斯方块. 具体代码与示例可访问我的另一个博客查看,源码与示例.
- Python实例---爬去酷狗音乐
项目一:获取酷狗TOP 100 http://www.kugou.com/yy/rank/home/1-8888.html 排名 文件&&歌手 时长 效果: 附源码: import t ...