//管子有六个状态,具体见啊哈算法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
int x;
int y;
};
struct node stack[100];//用栈存储路径
int top=-1;
int n;//图的规模
int map[51][51];//存图
int book[51][51];//标记走过的点
void dfs(int x,int y,int front)//front表示此点进水口,1,2,3,4表示左上右下
{
if(x==n&&y==n+1){
for(int i=0;i<=top;i++)
printf("(%d,%d)%c",i==top?'\n':' ');
return;
}
if(x<1||x>n||y<1||y>n)
return;
if(book[x][y]==1)
return;
book[x][y]=1;
top++;
stack[top].x=x;
stack[top].y=y;
//假如此管子为直管
if(map[x][y]>=5&&map[x][y]<=6){
if(front==1)
dfs(x,y+1,1);
else if(front==2)
dfs(x+1,y,2);
else if(front==3)
dfs(x,y-1,3);
else if(front==4)
dfs(x-1,y,4);
}
//假如此管子是弯管
if(map[x][y]>=1&&map[x][y]<=4){
if(front==1){
dfs(x-1,y,4);
dfs(x+1,y,2);
}
else if(front==2){
dfs(x,y-1,3);
dfs(x,y+1,1);
}
else if(front==3){
dfs(x-1,y,4);
dfs(x+1,y,2);
}
else if(front==4){
dfs(x,y+1,1);
dfs(x,y-1,3);
}
}
//取消标记
book[x][y]=0;
top--;
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
for(int i=0;i<51;i++)
memset(book[i],0,sizeof(book[i]));
dfs(1,1,1);
return 0;
}
啊哈算法DFS应用之水管工游戏
最新推荐文章于 2022-12-30 08:00:00 发布