dfs算法c语言 寻路,递归2寻路之dfs

本文探讨了两个编程问题:一是通过代码解决走出迷宫的问题,使用深度优先搜索策略,输出所有可能的路径;二是计算6x6方格的不同分割方法,通过中心对称性找到解决方案。这两个问题都涉及到了递归和图形分割算法的应用。
摘要由CSDN通过智能技术生成

练习:

1给定一个迷宫矩阵,入口,出口,输出走出迷### 宫的所有路径代码:public class P1 {

static int m=4,n=6;

int[][] map= {

{1,1,1,1,1,1},

{0,1,0,1,0,1},

{1,1,0,1,0,1},

{1,1,1,1,1,1}

};

int dir[][]= {{1,0},{0,1},{-1,0},{0,-1}};

int arr[]=new int[m*n*m];

int length=0;

void f1(int x,int y) {

if(x==m-1&&y==n-1) {

for(int i=0;i

System.out.print(arr[i]+","+(i%2==0?"":" "));

System.out.println();

return;

}

for(int i=0;i<4;i++) {

int x1=x+dir[i][0];

int y1=y+dir[i][1];

if(x1>=0&&x1=0&&y1

{

map[x1][y1]=2;

arr[length++]=x1;

arr[length++]=y1;

f1(x1, y1);

map[x1][y1]=1;

length-=2;

}

}

}

public static void main(String[] a) {

new P1().f1(0, 0);

}

}

输出:

0,1, 1,1, 2,1, 3,1, 3,2, 3,3, 3,4, 3,5,

0,1, 1,1, 2,1, 3,1, 3,2, 3,3, 2,3, 1,3, 0,3, 0,4, 0,5, 1,5, 2,5, 3,5,

0,1, 1,1, 2,1, 2,0, 3,0, 3,1, 3,2, 3,3, 3,4, 3,5,

0,1, 1,1, 2,1, 2,0, 3,0, 3,1, 3,2, 3,3, 2,3, 1,3, 0,3, 0,4, 0,5, 1,5, 2,5, 3,5,

0,1, 0,2, 0,3, 1,3, 2,3, 3,3, 3,4, 3,5,

0,1, 0,2, 0,3, 0,4, 0,5, 1,5, 2,5, 3,5,

思路:

从起点向四个方向遍历,如果可以通行则该位置通行,存在数组arr中,并进行标注,如果走到终点输出arr中的值

下面开始正题:

蓝桥杯 方格分割

标题:方格分割

6x6的方格,沿着格子的边线剪开成两部分。

要求这两部分的形状完全相同。

如图:就是可行的分割法。

bVbL9DD

bVbL9DG

bVbL9DH

试计算:

包括这3种分法在内,一共有多少种不同的分割方法。

注意:旋转对称的属于同一种分割法。

请提交该整数,不要填写任何多余的内容或说明文字。

解题思路:题目要求沿着格子的边线剪成两个部分,仔细观察,剪开的边线是关于中心点(3,3)对称的,于是我们从点(3,3)开始搜索,public class fgfg {

public static int N=6;

public static int [][]map=new int[N+1][N+1];

public static int count=0;

public static int [][]dir= {{0,1},{1,0},{0,-1},{-1,0}};

public static void f1(int x,int y) {

if(x==0||y==0||x==N||y==N) {

count++;

return;

}else {

for(int i=0;i<4;i++) {

int x1=x+dir[i][0];

int y1=y+dir[i][1];

if(map[x1][y1]==1)

continue;

map[x1][y1]=map[N-x1][N-y1]=1;

f1(x1,y1);

map[x1][y1]=map[N-x1][N-y1]=0;

}

}

}

public static void main(String[] args) {

map[N/2][N/2]=1;

f1(3,3);

System.out.println(count/4);

}

}输出:

509

小练习:

输入

第一行输入一个整数N,表示共有N组测试数据

每一组数据都是先输入该地图的行数m(0

然后,输入接下来的m行每行输入n个数,表示此处有水还是没水

(1表示此处是水池,0表示此处是地面)

输出

输出该地图中水池的个数。

每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。

---------------------------------------------------------Zzh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值