解决的问题:(本文章解决的是解题思路1,余下二个比较简单)
1.同颜色连在一起的方块消除、消消看等同类游戏的算法实现
解题思路
1.把同色的分成n块区域
2.对每块区域进行判断,比如 3个以上横竖连在一起
3.输出想要的结果,找到了所有3个以上横或者竖连在一起
//代码超短的cmd模式 http://www.cnblogs.com/caoke/p/cmd.html var require,define; (function(){ var module={} require=function(name){ return module[name] } define=function(name,func){ var exports= module[name]={} module.exports=exports func(require,exports,module) return exports } })()
我的代码开发模式是cmd模式,每次就不贴出来了,需要的看上一行
define("solve",function(require,exports,module){ //输入 var N=10,M=8; var field=[] var str=2 var res=0 var pointArr=[] //现在位置 function dfs(x,y){ field[y][x]=null pointArr[res].push({ x:x, y:y }) for(var dx=-1;dx<=1;dx++){ for(var dy=-1;dy<=1;dy++){ if(dx+dy==0||dx-dy==0){continue;} //向x方向移动dx,向y方向移动dy,移动的结果为(nx,ny) var nx=x+dx,ny=y+dy; //判断(nx,ny)是不是在院子内,以及是否有积水 if(0<=nx&&nx<N&&0<=ny&&ny<M&&field[ny][nx]==str){ dfs(nx,ny) } } } } //查找区块 function solve(str_search,map,width,height){ field=[].concat(map) N=width||field[0].length M=height||field.length str=str_search||str res=0 for(var i=0;i<N;i++){ for(var j=0;j<M;j++){ if(field[j][i]==str){ pointArr[res]=[] dfs(i,j) res++ } } } return pointArr } exports.solve=solve }) //查找所有2相连的(上下左右算相连的),最后搜出来一共有3块,给出了个二维数组 var arr1=[ [1,2,1,1,1,1,1,1,1,1], [1,2,1,1,1,1,1,1,1,1], [1,1,2,2,2,1,1,1,1,1], [1,1,1,1,2,1,1,1,1,1], [1,1,1,1,2,1,1,1,1,1], [1,1,1,1,1,1,2,1,1,1], [1,1,1,1,1,1,2,1,1,1], [1,1,1,1,1,1,1,1,1,1] ] var arr=require("solve").solve(2,arr1) console.log(arr)
解决问题2:对搜出来的二维数组,循环每个区块,如果区块的长度>=3,里面的元素有3个以上的x或y坐标相同,那么恭喜你,找到了颜色相同的3个以上横或竖连在一起,具体逻辑明天想想。
一天写了3篇文章,有点累了,但还是需要继续学习,也希望各个码友继续努力!
结果:
[ [ { x: 1, y: 0 }, { x: 1, y: 1 } ],
[ { x: 2, y: 2 },
{ x: 3, y: 2 },
{ x: 4, y: 2 },
{ x: 4, y: 3 },
{ x: 4, y: 4 } ],
[ { x: 6, y: 5 }, { x: 6, y: 6 } ] ]