连连看的算法:连连看算法



#<stdio.h>
#<stdlib.h>
#<time.h>
#MAX_WIDTH20
#MAX_HIGH20
#MAX_NUMBER50
#SAME_NUMBER4
#PAUSE
typedefstructtagPOINT{
x;
y;
}POINT;
Initmap(aMap[MAX_WIDTH][MAX_HIGH]);
PrMap(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2);
PrMap(aMap[MAX_WIDTH][MAX_HIGH]);
Find(aMap[MAX_WIDTH][MAX_HIGH]);
//测试是否结束
booltestEmpty(aMap[MAX_WIDTH][MAX_HIGH]);
//测试两个点是不是能条线连接
booltestLine(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2);
//测试个折线
booltestcorner(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2);
//测试两个折线
booltesttwocorner(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2);
(argc,char*argv)
{
Map[MAX_WIDTH][MAX_HIGH]={0};
Initmap(Map);
PrMap(Map);
x=0;
while(1){
Find(Map);
(testEmpty(Map))
;
(x>5){
prf(\"无解你运气真好!\\n\");
;
}
}
0;
}
Initmap(aMap[MAX_WIDTH][MAX_HIGH])
{
srand((unsigned)time(NULL));//化随机数发生器
//initmap
for(map1=0;map1<SAME_NUMBER;map1){//化地图
for(i=1;i<=MAX_NUMBER;i){
x=rand%MAX_WIDTH;
y=rand%MAX_HIGH;
(0aMap[x][y]){
aMap[x][y]=i;
}{
i--;
}
}
}
1;
}
PrMap(aMap[MAX_WIDTH][MAX_HIGH])
{
system(\"cls.exe\");
prf(\"\");
for(x=0;x<MAX_WIDTH;x)prf(\"%02d\",x);
prf(\"\\n\");
//输出棋盘
prf(\"┌\");
for(x=0;x<MAX_WIDTH*3/2;x)prf(\"─\");
prf(\"┐\\n\");

for(a=0;a<MAX_HIGH;a){
prf(\"│\");
for(b=0;b<MAX_WIDTH;b){
(0aMap[b][a]){
prf(\"\"); [Page]
}{
prf(\"%02d\",aMap[b][a]);
}
}
prf(\"│%d\\n\",a);
}
prf(\"└\");
for(x=0;x<MAX_WIDTH*3/2;x)prf(\"─\");
prf(\"┘\\n\");
1;
}
PrMap(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2)
{
//;
temp=aMap[ap1->x][ap1->y];
system(\"cls.exe\");
prf(\"\");
for(x=0;x<MAX_WIDTH;x)prf(\"%02d\",x);
prf(\"\\n\");
prf(\"┌\");
for(x=0;x<MAX_WIDTH*3/2;x)prf(\"─\");
prf(\"┐\\n\");
//输出棋盘
for(a=0;a<MAX_HIGH;a){
prf(\"│\");
for(b=0;b<MAX_WIDTH;b){
(0aMap[b][a]){
prf(\"\");
}
(tempaMap[b][a]){
prf(\"*%02d\",aMap[b][a]);
}{
prf(\"%02d\",aMap[b][a]);
}
}
prf(\"│%d\\n\",a);
}
prf(\"└\");
for(x=0;x<MAX_WIDTH*3/2;x)prf(\"─\");
prf(\"┘\\n\");
aMap[ap1->x][ap1->y]=0;
aMap[ap2->x][ap2->y]=0;
1;
}
Find(aMap[MAX_WIDTH][MAX_HIGH])
{
POINTp1={0};
POINTp2={0};
//列出所有选择方案
for(x1=0;x1<MAX_WIDTH;x1){
for(y1=0;y1<MAX_HIGH;y1){
for(x2=0;x2<MAX_WIDTH;x2){
for(y2=0;y2<MAX_HIGH;y2){
p1.x=x1;
p1.y=y1;
p2.x=x2;
p2.y=y2;
((aMap[p1.x][p1.y]0)||(aMap[p2.x][p2.y]0))continue;//不为0


(aMap[p1.x][p1.y]!=aMap[p2.x][p2.y])continue;//相等
((x1x2)&&(y1y2))continue;//同个点
(testLine(aMap,&p1,&p2)){
temp=aMap[p1.x][p1.y];
PrMap(aMap,&p1,&p2);
prf(\"直线数值=%dp1=%d,%d,p2=%d,%d\\n\",temp,p1.x,p1.y,p2.x,p2.y);
#defPAUSE [Page]
system(\"pause\");
#end
continue;
}

(testcorner(aMap,&p1,&p2)){
temp=aMap[p1.x][p1.y];
PrMap(aMap,&p1,&p2);
prf(\" 2直线数值=%dp1=%d,%d,p2=%d,%d\\n\",temp,p1.x,p1.y,p2.x,p2.y);
#defPAUSE
system(\"pause\");
#end
continue;
}
(testtwocorner(aMap,&p1,&p2)){
temp=aMap[p1.x][p1.y];
PrMap(aMap,&p1,&p2);
prf(\" 3直线数值=%dp1=%d,%d,p2=%d,%d\\n\",temp,p1.x,p1.y,p2.x,p2.y);
#defPAUSE
system(\"pause\");
#end
continue;
}//*/
}
}
}
}
1;
}

booltestLine(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2)//测试两个点是不是能条线连接
{
((ap1->xap2->x)||(ap1->yap2->y)){
(ap1->xap2->x){//x轴相等
lisum=0;
min=0;
max=0;
(ap1->y>ap2->y){
min=ap2->y;
max=ap1->y;
}{
max=ap2->y;
min=ap1->y;
}
for(x=min+1;x<max;x){
(aMap[ap1->x][x])false;
}
true;
}
(ap1->yap2->y){//x轴相等
lisum=0;
min=0;
max=0;
(ap1->x>ap2->x){
min=ap2->x;
max=ap1->x;
}{
max=ap2->x;
min=ap1->x;
}
for(x=min+1;x<max;x){
(aMap[x][ap2->y])false; [Page]
}
true;
}
}{
false;
}
false;
}
booltestcorner(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2)
{
POINTtempPo={0};
for(x=0;x<MAX_WIDTH;x){
for(y=0;y<MAX_HIGH;y){
(0!=aMap[x][y])
continue;//不是空白
tempPo.x=x;
tempPo.y=y;
(testLine(aMap,ap1,&tempPo)){
(testLine(aMap,&tempPo,ap2)){
//prf(\"tp%d,%d\\n\",x,y);
true;
}
}
}
}
false;
}
booltesttwocorner(aMap[MAX_WIDTH][MAX_HIGH],POINT*ap1,POINT*ap2)
{
POINTtP1={0};
POINTtP2={0};
for(x1=0;x1<MAX_WIDTH;x1){
for(y1=0;y1<MAX_HIGH;y1){
for(x2=0;x2<MAX_WIDTH;x2){
for(y2=0;y2<MAX_HIGH;y2){
(0!=aMap[x1][y1])
continue;//不是空白
(0!=aMap[x2][y2])
continue;//不是空白
tP1.x=x1;
tP1.y=y1;
tP2.x=x2;
tP2.y=y2;
(testLine(aMap,&tP1,&tP2)){


(testLine(aMap,&tP1,ap1)&&testLine(aMap,&tP2,ap2)){
prf(\"t1=%d,%dt2=%d,%d\\n\",x1,y1,x2,y2);
true;
}
}
}
}
}
}
false;
}
booltestEmpty(aMap[MAX_WIDTH][MAX_HIGH])
{
lisum=0;
for(x=0;x<MAX_WIDTH;x){
for(y=0;y<MAX_HIGH;y){
lisum=lisum+aMap[x][y];
}
}
(0lisum)
true;
false;
}
Tags:  连连看 连连看的算法

延伸阅读

最新评论

发表评论