《连连看》算法C语言演示(自动连连看)(3)

//printf("begin match:%d,%d\n",p1.x,p1.y);
    int c1=map[p1.x][p1.y];
    for (iy=p1.y;iy<_height;iy++){
        for(ix=0;ix<_width;ix++){
            //遍历查找整个图板的时候,图板中,起始点之前的图片实际已经查找过
            //所以应当从图片之后的部分开始查找才有效率
            //遍历的方式是逐行、每行中逐个遍历
            //在第一次循环的时候,x坐标应当也是起始点的下一个,所以使用inner1来确认第一行循环
            if (inner1){
                ix=p1.x+1;
                inner1=FALSE;
            }
            if(map[ix][iy] != c1){
                //printf("skip:%d,%d\n",ix,iy);
                //continue;
            } else {
                _point p2;
                p2.x=ix;
                p2.y=iy;
                if (!havePath(p1,p2)){
                    //printf("No path from [%d,%d] to [%d,%d]\n",p1.x,p1.y,p2.x,p2.y);
                } else {
                    dumpMapWithHotPoint(p1,p2);
                    map[p1.x][p1.y]=empty;
                    map[p2.x][p2.y]=empty;
                    //dumpMap();
                    return TRUE;
                }
            }
        }
    };
    return FALSE;
}
//这个函数式扫描全图板,自动连连看
bool searchAllMap(){
    int ix,iy;
    bool noPathLeft=FALSE;
    while(!noPathLeft){
        noPathLeft=TRUE;
        for (iy=0;iy<_height;iy++){
            for(ix=0;ix<_width;ix++){
                if(map[ix][iy] != empty){
                    _point p;
                    p.x=ix;
                    p.y=iy;
                    if(searchMap(p) && noPathLeft)
                        noPathLeft=FALSE;
                }
            }
        }
        printf("next loop...\n");
    };
    return TRUE;
}
//-----------------main-----------------------------
int main(int argc,char **argv){
    srand((unsigned)time(NULL));
    memset(map,0,sizeof(map));
    setRndMap();
    dumpMap();
    searchAllMap();
}

运行结果会是类似这样:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/56e4f54cdb339007498ae69a67cbcac4.html