#include<cstdio>
#include<iostream>
using namespace std;
int a[51][51];//假设徒弟的大小不超过50*50
int book[51][51],n,m,flag=0;
struct note{
int x;//横坐标
int y;//纵坐标
}s[100];
int top=0;
void dfs(int x,int y,int front){
int i;
//判断是否到达终点,请注意这里y的坐标是m+1,想一想为啥
if(x==n&&y==m+1){
flag=1;//找到铺设方案
cout<<endl<<"能找到铺设方案,铺设路径为:"<<endl;
for(i=1;i<=top;i++){
printf("(%d,%d) ",s[i].x,s[i].y);
}
return;
}
//判断是否越界
if(x<1||x>n||y<1||y>m){
return;
}
//判断这个管道是否在路径中已经使用过
if(book[x][y]==1){
return;
}
book[x][y]=1;//标记使用当前这个管道
//将当前尝试的坐标入栈
top++;
s[top].x=x;
s[top].y=y;
//当前水管是直管的情况
if(a[x][y]>=5&&a[x][y]<=6){
if(front==1){//进水口在左边的情况
dfs(x,y+1,1);//只能使用5号这种摆放方式
}
if(front==2){//进水口在上边的情况
dfs(x+1,y,2);//只能使用6号这种摆放方式
}
if(front==3){//进水口在右边的情况
dfs(x,y-1,3);//只能使用5号这种摆放方式
}
if(front==4){//进水口在下边的情况
dfs(x-1,y,4);//只能使用6号这种摆放方式
}
}
//当前水管是弯管的情况
if(a[x][y]>=1&&a[x][y]<=4){
if(front==1){//进水口在左边的情况
dfs(x+1,y,2);//3号状态
dfs(x-1,y,2);//4号状态
}
if(front==2){//进水口在上边的情况
dfs(x,y+1,1);//1号状态
dfs(x,y-1,3);//4号状态
}
if(front==3){//进水口在右边的情况
dfs(x-1,y,4);//1号状态
dfs(x+1,y,2);//2号状态
}
if(front==4){//进水口在下边的情况
dfs(x,y+1,1);//2号状态
dfs(x,y-1,3);//3号状态
}
}
book[x][y]=0;//取消标记
top--;//将当前尝试的坐标出栈
return;
}
int main(){
int i,j,num=0;
cout<<"请输入n和m,n为行,m为列:"<<endl;
cin>>n>>m;
//读入游戏地图
cout<<"请输入地图矩阵:"<<endl;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>a[i][j];
}
}
//开始搜索,从(1,1)点开始,进水方向也是1
dfs(1,1,1);
//判断是否找到铺设方案
if(flag==0){
cout<<"impossible"<<endl;
}
getchar();
return 0;
}
4.6水管工游戏
最新推荐文章于 2020-10-06 11:57:30 发布