简单水池&&迷宫问题
#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*算法. 通常情况下,迷宫寻路算法可以使用深度优先或者广度优先算法,但是由于效率的原因,不会直接使用这些算 ...
随机推荐
- highCharts 图表统计控件使用方法
1.首先引用js文件 在引用上面文件时,保证已经引用了jquery.js文件.且位置在上面两个文件之前. 2. <div id="container" style=" ...
- How to Enable or Disable a cell in DataGridview Row ?
Following link http://msdn.microsoft.com/en-us/library/ms171619.aspxhttp://windowsclient.net/blogs/f ...
- 使用C#的自定义事件
public class CarDealer { public Action<string> NewCarInfo; //使用系统定义的泛型委托 public void NewCarCom ...
- iPhone 被同步到 Mac上后 如果不希望更新到Mac上在哪里删除?
前往文件夹 /Users/用户名/Library/Application Support/MobileSync 直接删除 就行了(同时要倾倒废纸篓). 目前iPhone链接Mac 后 不让 ...
- Nhibernate 分页
public IList<Student> GetStudentByPage(int pageSize, int pageIndex, string SName) { ISession s ...
- 状态机的c语言编程
http://blog.csdn.net/shandongdaya/article/details/7282547 一 有限状态机的实现方式 有限状态机(Finite State Machine或者F ...
- PartialFunction(偏函数)
val one:PartialFunction[Int,String]={ case 1 => "one" case 2 => "two" case ...
- ES Head is not working with elasticsearch-1.4.0.Beta1
ES Head is not working with elasticsearch-1.4.0.Beta1: https://github.com/elastic/elasticsearch/issu ...
- 2015第31周三Jetty
Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所 ...
- 3Sum Closest——LeetCode
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...