简单水池&&迷宫问题
#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*算法. 通常情况下,迷宫寻路算法可以使用深度优先或者广度优先算法,但是由于效率的原因,不会直接使用这些算 ...
随机推荐
- 使用微妙计算PHP脚本执行时间
在PHP中,大多数的时间格式都是以UNIX时间戳表示的,而UNIX时间戳是以s(秒)为最小的计量时间的单位.这对某些应用程序来说不够精确,所以可以调用microtime()返回当前UNIX时间戳和微妙 ...
- CLR via C#可空值类型
我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...
- NSIndexSet-入门浅析
NSIndexSet-入门浅析 记得上一次,用到,关于删除UITableView分组的方法 [tableView deleteSections:[NSIndexSet indexSetWithIn ...
- iOS 开发工程师
iOS 开发工程师 工作职责: 负责下厨房 iPhone 客户端的产品开发.维护.优化以及扩展. 任职要求: 对技术有热情,热爱新的挑战 熟悉 CocoaTouch, ASIHttpRequest, ...
- 最近国外很拉风的,,基于.net 的一个手表
site:http://agentwatches.com/ 这个项目是一个国外工作室,筹集资金 创立的. 直接用c# 代码编译显示在手机上.能和智能手机通信等. 并且是开源的. 很酷 其次.它提供了. ...
- html动态编辑框
简述: 随着在输入框中增加字符,动态矿高度增加(IE9及以上 chrome firefox) 由于IE8 不支持oninput函数,所以不能实现此效果 事件函数: function feedDivO ...
- Android自定义ActionBar
Android 3.0及以上已经有了ActionBar的API,可以通过引入support package在3.0以下的平台引用这些API,但这儿呢,完全自定义一个ActionBar,不用引入额外ja ...
- 理解和使用NT驱动程序的执行上下文
理解Windows NT驱动程序最重要的概念之一就是驱动程序运行时所处的“执行上下文”.理解并小心地应用这个概念可以帮助你构建更快.更高效的驱动程序. NT标准内核模式驱动程序编程的一个重要观念是某个 ...
- 【HDOJ】1726 God’s cutter
简单DP. /* 1726 */ #include <cstdio> #include <cstring> #include <cstdlib> #define M ...
- Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
本文转自:http://www.cnblogs.com/yuerdongni/archive/2012/08/18/2645140.html 在使用SQL2005(或2008)是可能会遇到错误提示: ...