假设连连看棋盘是:
#define 行 11
#define 列 19
棋盘数据是(注意255表示空图标):
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 001 002 003 004 005 006 007 008 009 008 010 011 012 013 011 014 015 255
255 016 017 018 001 007 019 020 021 022 009 023 019 024 021 025 026 010 255
255 007 015 018 027 024 004 008 012 028 029 030 031 032 017 003 027 033 255
255 034 027 028 015 035 026 019 033 036 034 005 009 025 025 037 013 015 255
255 037 017 038 023 036 039 014 011 255 013 016 033 001 011 009 040 022 255
255 017 004 038 035 040 019 040 002 041 033 007 026 012 013 014 014 025 255
255 024 023 018 040 037 016 008 005 036 002 018 001 034 039 035 039 041 255
255 005 030 030 003 038 039 024 041 035 022 020 037 022 003 034 027 010 255
255 004 029 038 031 006 010 030 006 026 002 012 041 036 016 032 023 006 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
坐标是:
算法如下:
bool 能否消除(int 行1,int 列1,int 行2,int 列2)
{
if(水平消除(行1,列1,行2,列2))
return true;
if(垂直消除(行1,列1,行2,列2))
return true;
if(一个拐角消除(行1,列1,行2,列2))
return true;
if(两个拐角消除(行1,列1,行2,列2))
return true;
return false;
}
bool 水平消除(int 行1,int 列1,int 行2,int 列2)
{
int i;
if(行1 == 行2)
{
for(i = 列1 + 1; i < 列2; i++) //左往右
{
if(num[行1][i] != 255)
{
break;
}
}
if(i == 列2)
return true;
else
return false;
}
else
return false;
}
bool 垂直消除(int 行1,int 列1,int 行2,int 列2)
{
int i;
if(列1 == 列2)
{
for(i = 行1 + 1; i < 行2; i++) //上往下
{
if(num[i][列1] != 255)
{
break;
}
}
if(i == 行2)
return true;
else
return false;
}
else
return false;
}
bool 一个拐角消除(int 行1,int 列1,int 行2,int 列2)
{
if(行1 < 行2 && 列1 > 列2)
{
//左下
if(水平消除(行1,列2-1,行1,列1))
if(垂直消除(行1,列2,行2,列2))
{
return true;
}
//下左
if(垂直消除(行1,列1,行2+1,列1))
if(水平消除(行2,列2,行2,列1))
{
return true;
}
}
else if(行1 < 行2 && 列1 < 列2)
{
//右下
if(水平消除(行1,列1,行1,列2+1))
if(垂直消除(行1,列2,行2,列2))
{
return true;
}
//下右
if(垂直消除(行1,列1,行2+1,列1))
if(水平消除(行2,列1,行2,列2))
{
return true;
}
}
return false;
}
bool 两个拐角消除(int 行1,int 列1,int 行2,int 列2)
{
int i;
if(行1 == 行2)
{
//上右下
for(i = 行1-1; i>= 0; i--)
{
if(num[i][列1] == 255)
{
if(一个拐角消除(i,列1,行2,列2))
return true;
}
else
break;
}
//下右上
for(i = 行1+1; i<= 行-1; i++)
{
if(num[i][列1] == 255)
{
if(一个拐角消除(行2,列2,i,列1))
return true;
}
else
break;
}
}
//左下右
if(列1 == 列2)
{
for(i = 列1 - 1; i >= 0; i--)
{
if(num[行1][i] == 255)
{
if(一个拐角消除(行1,i,行2,列2))
return true;
}
else
break;
}
//右下左
for(i = 列1 + 1; i <= 列-1; i++)
{
if(num[行1][i] == 255)
{
if(一个拐角消除(行1,i,行2,列2))
return true;
}
else
break;
}
}
if(行1 < 行2 && 列1 > 列2)
{
for(i = 列1 - 1; i >= 0; i--)
{
if(num[行1][i] != 255)
break;
if(i == 列2)
continue;
if(一个拐角消除(行1,i,行2,列2))
return true;
}
for(i = 行1-1; i >= 0; i--)
{
if(num[i][列1] != 255)
break;
if(一个拐角消除(i,列1,行2,列2))
return true;
}
for(i=行1+1; i<=行-1; i++)
{
if(num[i][列1] !=255)
break;
if(i == 行2)
continue;
if(i < 行2)
{
if(一个拐角消除(i,列1,行2,列2))
return true;
}
else
{
if(一个拐角消除(行2,列2,i,列1))
return true;
}
}
for(i = 列1+1; i <= 列-1; i++)
{
if(num[行1][i] != 255)
break;
if(一个拐角消除(行1,i,行2,列2))
return true;
}
}
if(行1 < 行2 && 列1 < 列2)
{
for(i = 列1 + 1; i <= 列-1; i++)
{
if(num[行1][i] != 255)
break;
if(i == 列2)
continue;
if(一个拐角消除(行1,i,行2,列2))
return true;
}
for(i = 列1-1; i >= 0; i--)
{
if(num[行1][i] != 255)
break;
if(一个拐角消除(行1,i,行2,列2))
return true;
}
for(i=行1+1; i<=行-1; i++)
{
if(num[i][列1] !=255)
break;
if(i == 行2)
continue;
if(i < 行2)
{
if(一个拐角消除(i,列1,行2,列2))
return true;
}
else
{
if(一个拐角消除(行2,列2,i,列1))
return true;
}
}
for(i = 行1-1; i >= 0; i--)
{
if(num[i][列1] != 255)
break;
if(一个拐角消除(i,列1,行2,列2))
return true;
}
}
return false;
}