简单水池&&迷宫问题
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int M[101][101],flag[101][101];
int n,m;
int cnt;
void pool(int x,int y)
{
flag[x][y]=1;
M[x][y]=cnt;
if(x-1>=1&&M[x-1][y]!=0&&flag[x-1][y]==0) pool(x-1,y);
if(x+1<=n&&M[x+1][y]!=0&&flag[x+1][y]==0) pool(x+1,y);
if(y-1>=1&&M[x][y-1]!=0&&flag[x][y-1]==0) pool(x,y-1);
if(y+1<=m&&M[x][y+1]!=0&&flag[x][y+1]==0) pool(x,y+1);
}
int main()
{
int i,j,t;
cin>>t;
while(cin>>n>>m&&t--)
{
cnt=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>M[i][j];
//cout<<endl; // memset(m,0,sizeof(m));
memset(flag,0,sizeof(flag));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(M[i][j]==1&&flag[i][j]==0)
{
cnt++;pool(i,j);
}
printf("%d\n",cnt);
// for(i=1;i<=n;cout<<endl,i++)
// for(j=1;j<=m;j++)
// cout<<M[i][j]<<" ";
}
return 0;
}
//这一道题是有关搜索的,看看就行
#include <iostream>
#include <cstring>
using namespace std;
int a,b,c,d,sum,cnt;
int M[9][9]={
{1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,1},
{1,0,0,1,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1},
{1,0,0,0,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1}};
void dfs(int x,int y,int cnt)
{
if(x==c&&y==d) {if(cnt<sum) sum=cnt;}
else{
if(!M[x-1][y]) {M[x-1][y]=1; dfs(x-1,y,cnt+1); M[x-1][y]=0;}
if(!M[x+1][y]) {M[x+1][y]=1; dfs(x+1,y,cnt+1); M[x+1][y]=0;}
if(!M[x][y-1]) {M[x][y-1]=1; dfs(x,y-1,cnt+1); M[x][y-1]=0;}
if(!M[x][y+1]) {M[x][y+1]=1; dfs(x,y+1,cnt+1); M[x][y+1]=0;}
}
}
int main()
{
int t;
cin>>t;
while(t--&&cin>>a>>b>>c>>d)
{
cnt=0,sum=81;
dfs(a,b,cnt);
cout<<sum<<endl;
}
return 0;
}
这道题的代码,一开始不是这样写的,我另外定义一个flag,把每次访问的都标记,不过后面觉得这个是多此一举,可以在原来的数组上面,每次访问过后,都标记为墙1,这样就ok了,还有一个就是求最小的值,这个在dfs函数里面开始就给一个判断,其实大概的思路就是先找到一条路,记下步数,然后每次回溯,还原被标记的点,这样继续求出其他路径的值。。。。
#include <iostream>
#include <cstring>
using namespace std;
int M[9][9]={
{1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,1},
{1,0,0,1,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1},
{1,0,0,0,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1}},flag[100][100];
int n,m,cnt=0;
int a,b,c,d;
void maze(int x,int y)
{
if(x==c&&y==d) return; flag[x][y]=1;
if(x-1>=0&&M[x-1][y]==0&&flag[x-1][y]==0) {cnt++; maze(x-1,y); cnt--;flag[x-1][y]=0;}
if(x+1<=8&&M[x+1][y]==0&&flag[x+1][y]==0) {cnt++; maze(x+1,y); cnt--;flag[x+1][y]=0;}
if(y-1>=0&&M[x][y-1]==0&&flag[x][y-1]==0) {cnt++; maze(x,y-1); cnt--;flag[x][y-1]=0;}
if(y+1<=8&&M[x][y+1]==0&&flag[x][y+1]==0) {cnt++; maze(x,y+1); cnt--;flag[x][y+1]=0;}
}
int main()
{
//int i,j;
cin>>a>>b>>c>>d;
memset(flag,0,sizeof(flag));
//for(i=a;i<=8;i++)
// for(j=b;j<=8;j++)
maze(a,b);
cout<<cnt<<endl;
return 0;
}
后面想把路径打印出来,可是出不来,代码如下
#include <iostream>
#include <cstring>
using namespace std;
int a,b,c,d,sum,cnt,LJ1[1000],LJ2[1000],h,k;
int M[9][9]={
{1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,1},
{1,0,0,1,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1},
{1,0,0,0,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1}};
void dfs(int x,int y,int cnt)
{
LJ1[k++]=x;LJ2[h++]=y;
if(x==c&&y==d) {if(cnt<sum) sum=cnt;}
else{
if(!M[x-1][y]) {M[x-1][y]=1; dfs(x-1,y,cnt+1); M[x-1][y]=0;LJ1[k-1]=0;LJ2[h-1]=0;}
if(!M[x+1][y]) {M[x+1][y]=1; dfs(x+1,y,cnt+1); M[x+1][y]=0;LJ1[k-1]=0;LJ2[h-1]=0;}
if(!M[x][y-1]) {M[x][y-1]=1; dfs(x,y-1,cnt+1); M[x][y-1]=0;LJ1[k-1]=0;LJ2[h-1]=0;}
if(!M[x][y+1]) {M[x][y+1]=1; dfs(x,y+1,cnt+1); M[x][y+1]=0;LJ1[k-1]=0;LJ2[h-1]=0;}
}
}
int main()
{
int t,i;
cin>>t;
while(t--&&cin>>a>>b>>c>>d)
{
k=0;h=0;
memset(LJ1,0,sizeof(LJ1));
memset(LJ2,0,sizeof(LJ2));
cnt=0,sum=81;
dfs(a,b,cnt);
cout<<sum<<endl;
for(i=0;i<=100;i++)
cout<<LJ1[i]<<","<<LJ2[i]<<" → ";
}
return 0;
}
//怎么把路径打印出来,感觉如果走一条路不通,就标记为0,可是又有回溯,就感觉全乱了,如果在每次dfs后,干脆数组全为0,k,h也从0开始应该可以。。。
#include <iostream>
#include <mem.h>
using namespace std;
char M[30][30];
bool Find;
int flag[30][30];
int n,m;
void ss(int x,int y)
{
if(Find==true) return ; cout<<x<<" "<<y<<" →"; flag[x][y]=1;
int a,b;
int i;
//上走
a=x-1;
b=y;
if(a>=1&&M[a][b]!='w'&&flag[a][b]==0)
{
if(M[a][b]=='T')
{
Find=true;
return ;
}
ss(a,b);
}
//下走
a=x+1;
b=y;
//cout<<a<<n<<endl;
if(a<=n&&M[a][b]!='w'&&flag[a][b]==0)
{
if(M[a][b]=='T')
{
Find=true;
return ;
}
ss(a,b);
}
//左走
a=x;
b=y-1;
if(b>0&&M[a][b]!='w'&&flag[a][b]==0)
{
if(M[a][b]=='T')
{
Find=true;
return ;
}
ss(a,b);
}
//右走
a=x;
b=y+1;
if(b<=m&&M[a][b]!='w'&&flag[a][b]==0)
{
if(M[a][b]=='T')
{
Find=true;
return ;
}
ss(a,b);
}
}
int main()
{
int j,i,x,y;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>M[i][j];
if(M[i][j]=='s') {x=i;y=j;}
}
memset(flag,0,sizeof(flag));
ss(x,y);
return 0; }
//一个迷宫的问题,和水池问题是一个题型,不多讲了。。。。
简单水池&&迷宫问题的更多相关文章
- 利用c语言做简单的迷宫小游戏
#include <stdio.h> #define ROW 6 #define COL 6 // 封装打印地图的函数 void printMap(c ...
- kuangbin专题 专题一 简单搜索 迷宫问题 POJ - 3984
题目链接:https://vjudge.net/problem/POJ-3984 这个题目,emm,上代码,看的估计应该是刚开始接触搜索的,我带点注释,你能慢慢理解. #include <ios ...
- AI-随机迷宫&迷宫求解
本文记录了,人工智能中简单的搜索策略中的路径搜索策略中的A*算法,来实现迷宫寻路的问题.(这只是一次本人的课外作业) 完整的程序源码已经发送到我的Git.这里只记录了我的思路和感想以及收获. 产生随机 ...
- ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)
题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了. POJ2935-Basic Wall Maze 题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出 ...
- 【南京邮电】maze 迷宫解法
[南京邮电]maze 迷宫解法 题目来源:南京邮电大学网络攻防训练平台. 题目下载地址:https://pan.baidu.com/s/1i5gLzIt (密码rijss) 0x0 初步分析 题目中给 ...
- 如何用简单例子讲解 Q - learning 的具体过程?
作者:牛阿链接:https://www.zhihu.com/question/26408259/answer/123230350来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题
用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...
- 【Javascript + Vue】实现对任意迷宫图片的自动寻路
前言 可以直接体验最终效果:https://maze-vite.vercel.app/ 寻路前: 寻路后,自动在图片上生成红色路径,蓝色是探索过的区域: 这里我故意用手机斜着角度拍,就是为了展示程序完 ...
- 【小白学游戏常用算法】二、A*启发式搜索算法
在上一篇博客中,我们一起学习了随机迷宫算法,在本篇博客中,我们将一起了解一下寻路算法中常用的A*算法. 通常情况下,迷宫寻路算法可以使用深度优先或者广度优先算法,但是由于效率的原因,不会直接使用这些算 ...
随机推荐
- CRM窗体中只读的控件不会引发Update事件
在CRM的窗体设计时,如果把某一个控件设为只读了,仅管你在后台用代码修改了值,这个值也不会起任何作用,更不会提交到后台,触发Update事件!
- @font-face扒站的步骤
今天模仿百度首页手机版的时候遇到的@font-face的问题,现在整理一下. 问题:图中红色区域,在拷贝F12样式的时候,并没有出现这些小图标. 图1:百度的效果 ...
- Linux文本操作三大利器总结:sed、awk、grep
grep:(去除一行中需要的信息,同类与cut) grep全称是Global Regular Expression Print #常规用法 # grep -n root /etc/passwd :ro ...
- SQL数据库增删改查
数据类型 运行cmd 输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据库服务 输入net pause MSSQLserve ...
- java 双重检查模式
java 双重检查模式 在并发环境下 兼顾安全和效率 成例(Idiom)是一种代码层次上的模式,是在比设计模式的层次更具体的层次上的代码技巧.成例往往与编程语言密切相关.双重检查成例(Double C ...
- ExtJS5_自定义菜单1
顶部和底部区域已经作好,在顶部区域有一个菜单的按钮,这一节我们设计一个菜单的数据结构,使其可以展示出不同样式的菜单.由于准备搭建的是一个系统模块自定义的系统,因此菜单也是自定义的,在操作员系统登录的时 ...
- Matrix(线段树版)
poj2155:http://poj.org/problem?id=2155 题意;同上一遍随笔. 题解:这里用二维线段树打了一发.第一次学习别人的代码.才学的.这种树套树的程序,确实很费脑子,一不小 ...
- 全表扫描引发的db file sequential read
今天我要做一个SQL调优,监控该SQL, 利用ASH 监控 该SQL是在sid=4848 上面跑的 db file sequential read等待事件有3个参数:file#,first block ...
- 【HDOJ】1078 FatMouse and Cheese
这道题目是典型的DFS+记忆化搜索, DP思想.符合:含重叠子问题,无后效性等特点. #include <cstdio> #include <cstring> #include ...
- COJ 1008 WZJ的数据结构(八) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...