关于算法:递归2寻路之dfs

34次阅读

共计 1805 个字符,预计需要花费 5 分钟才能阅读完成。

练习:

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<length;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<m&&y1>=0&&y1<n&&map[x1][y1]==1) 
        {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 中的值

上面开始正题:

蓝桥杯 方格宰割

题目:方格宰割

6×6 的方格,沿着格子的边线剪开成两局部。
要求这两局部的形态完全相同。

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



试计算:
包含这 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<100)与列数 n(0<n<100),
而后,输出接下来的 m 行每行输出 n 个数,示意此处有水还是没水
(1 示意此处是水池,0 示意此处是高空)
输入
输入该地图中水池的个数。
每个水池的旁边(上下左右四个地位)如果还是水池的话的话,它们能够看做是同一个水池。

———————————————————Zzh

正文完
 0