微信小程序一笔画一代手动辅助
前两天看见微信里有同学在玩一笔画,我就玩了一会,很简单,但是还是有比较困难的关卡,比如这个
然后就想着用算法写一个辅助,首先想到的就是回溯了,
话不多说,先上成果
第一个结果是可行的,但是为什么会有第二个我还不清楚,有弄懂的可以分享一下
因为用的Java,本着面向对象的原则,定义了一个类OnePenCat.java
定义一个二维数组表示地图,再定义一个二维字符数组,保存结果,一个end()方法,检查是否结束,最重要的就是回溯算法了,
getKey(int i,int j);代码中都加了注释,应该很容易阅读,就不解释了,还有几个打印数组的方法,在Main.java里定义一个你想要知道结果的地图(这就是为什么我叫它手动辅助的原因了),然后定义对象,执行getKey方法就好了
具体代码
public class OnePenCat {
public static int MAX = 20;
//0代表不用填,1代表需要填
int map[][];
//存放结果的数组,一个数字表示,一个箭头表示
int[][] key=new int[MAX][MAX];
char[][] charkey = new char[MAX][MAX];
//保存当前步数
int k = 2;
//构造函数
public OnePenCat(int map[][]){
this.map = map;
//将字符结果数组初始化
for(int i= 0;i<map.length;i++){
for(int j = 0;j<map[i].length;j++){
charkey[i][j] = '—';
}
}
}
//判断是否结束,当所有方格全部为不可填充结束
public boolean end(){
for(int i=0;i<map.length;i++){
for(int j=0;j<map[i].length;j++){
if(map[i][j] == 1){
return false;
}
}
}
return true;
}
//得到解的方法,i cat当前所在的行,j cat当前所在的列,
public void getKey(int i,int j){
key[i][j] = k;
//printkey(key);
//System.out.println(key[i][j]);
map[i][j] = 0; //将当前块设为不可填充
//System.out.println("k="+k);
k = k+1;
//填完,打印结果
if(end()){
printkey(key);
//printmap();
printcharkey(charkey);
return;
}
//如果 n 不等于 0 继续填
if(end() == false){
//printmap();
//printkey();
if(map[i-1][j] == 1){
charkey[i][j] = '↑';
//System.out.println("向上");
getKey(i-1,j);
}
if(map[i][j+1] == 1){
charkey[i][j] = '→';
//System.out.println("向右");
getKey(i,j+1);
}
if(map[i+1][j] == 1){
charkey[i][j] = '↓';
//System.out.println("向下");
getKey(i+1,j);
}
if(map[i][j-1] == 1){
charkey[i][j] = '←';
//System.out.println("向左");
getKey(i,j-1);
}
//四个方向都没有可填充的方块
//并且没有填完,回退,将当前块设为可填充
map[i][j] = 1;
k=k-1;
}
}
//打印结果
public void printkey(int[][] key){
for(int i = 0; i<map.length;i++){
for(int j = 0;j<map[i].length;j++){
System.out.print(key[i][j]+", ");
}
System.out.println();
}
}
public void printmap() {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j] + ", ");
}
System.out.println();
}
}
public void printcharkey(char[][] charkey){
for(int i = 0; i<map.length;i++){
for(int j = 0;j<map[i].length;j++){
System.out.print(charkey[i][j]+", ");
}
System.out.println();
}
}
}
public class Main {
public static void main(String[] args) {
System.out.println("This is OnePenCat");
//新建一个地图
int map[][]={
{0,0,0,0,0,0,0,0},
{0,0,1,0,1,1,1,0},
{0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0},
{0,0,1,1,1,0,1,0},
{0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0}
};
/*int map[][] = {
{0,0,0,0,0,0,0},
{0,1,1,1,1,1,0},
{0,1,1,1,1,1,0},
{0,0,0,0,0,0,0}
};*/
//起点
int i = 6,j = 2;
OnePenCat cat = new OnePenCat(map);
// int[][] key=map;
cat.getKey(i,j);
//int key[][] = cat.map;
//cat.printkey();
}
}
也就是写着玩,要是真的想用还挺麻烦呢