求一连连看算法 C 语言

给定二维数组A[row+2][col+2],(row*col<20*20),边界为0表示空点,其余为1,2,...表示不同点1)给出判断两点是否可消的函数2)给出A的一个... 给定二维数组A[row+2][col+2],(row*col<20*20),边界为0表示空点,其余为1,2,...表示不同点
1)给出判断两点是否可消的函数
2)给出A的一个解;若无解,给出一个使剩余数最少的解
3)改写2)的程序,当A消去元素后向指定方向(事先给定上下左右)靠拢
期中作业,O(∩_∩)O谢谢
————————————————
Draconcious 能帮忙写下吗?
向左靠拢就是消除元素后,其右侧元素左移。比如:消去A[2][10]则:A[2][10]=A[2][11],A[2][11]=A[2][12],......(不懂可以参考下Excel删除单元格的操作)
向其它方向靠拢的类推
————————————————
写出函数才给分,给分标准
1):50
2):100
3):50
展开
 我来答
spook3658
2010-10-27 · TA获得超过6367个赞
知道大有可为答主
回答量:1336
采纳率:0%
帮助的人:1920万
展开全部
第一个:
bool isClear(int row1,int col1,int row2,int col2)
{
int row,col;
for(row=1;row<=ROW;row++)
if( check_point(row,col1) && check_point(row,col2) )
if( check_col(col1,row1,row) && check_row(row,col1,col2)
&& check_col(col2,row2,row) )
return true;
for( col=1;col<COL;col++)
if( check_point(row1,col) && check_point(row2,col) )
if( check_row(row1,col1,col) && check_col(col,row1,row2)
&& check_row(row2,col2,col) )
return true;
return false;
}
第二个:回溯算法
bool ClearAll()
{
int row1,col1,row2,col2;
for( row1=1;row1<ROW;row1++)
for( col1=1;col1<COL;col1++)
if( A[row1][co1]!=0 )
for( row2=row1;row2<ROW;row2++)
for( col2=1;col2<COL;col2++)
if(row2>row1 || col2>col1)
if( A[row2][col2]==A[row1][col1]
&& isClear(row1,col1,row2,col2) )
{
SaveWay();
Delete(row1,col1,row2,col2);
if( ClearAll() )
return true;
else
Load();
}
return false;
}
第三个:改写下Delete/Load函数就可以了,我就不贴出来了
=================================================
含有很多简单的函数没写,不懂再问我吧
Draconious
2010-10-24 · TA获得超过6242个赞
知道大有可为答主
回答量:2142
采纳率:0%
帮助的人:2581万
展开全部
第一个如果严格按照连连看的规则来做其实很简单。因为连连看里所有的空白方格都是相连的,不会出现某个空白方格被围住的情况发生。所以要判断两点是否可消除,只要看看这两个点有没有相邻的空白方格就可以了。

int isConnected(int **board,int length,int width,int x1,int y1,int x2,int y2){
int a=board[x1-1][y1-1]==0;
int b=board[x1-1][y1]==0;
int c=board[x1-1][y1+1]==0;
int d=board[x1][y1+1]==0;
int e=board[x1+1][y1+1]==0;
int f=board[x1+1][y1]==0;
int g=board[x1+1][y1-1]==0;
int h=board[x1][y1-1]==0;
int i=board[x2-1][y2-1]==0;
int j=board[x2-1][y2]==0;
int k=board[x2-1][y2+1]==0;
int l=board[x2][y2+1]==0;
int m=board[x2+1][y2+1]==0;
int n=board[x2+1][y2]==0;
int o=board[x2+1][y2-1]==0;
int p=board[x2][y2-1]==0;
return (a||b||c||d||e||f||g||h)&&(i||j||k||l||m||n||o||p);
}

第二个的话我要试一试,因为这是个很没效率的算法,我不确定我的电脑能运行,我也不确定你的电脑能运行得了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友a3722676e
2010-10-26 · TA获得超过1215个赞
知道小有建树答主
回答量:957
采纳率:0%
帮助的人:864万
展开全部
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

int anArr[19][19];
int IfClear()
{
int aRow, aLine, bRow, bLine;

Again:
printf("输入两个点的横坐标与纵坐标(以0为原点):\n例子:1,3 2,5\n");
scanf("%d,%d %d,%d", &aRow, &aLine, &bRow, &bLine);
if (aRow<0||aRow>18||aLine<0||aLine>18||bRow<0||bRow>18||bLine<0||bLine>18)
{
printf("输入错误,重新输入:");
goto Again;
}
if (anArr[aLine][aRow] == anArr[bLine][bRow])
return 1;
return 0;
}
int Direction(const int type)
{
int row, line, temp;

if (type == 1)
{
for (row = 1; row < 18; ++row)
{
for (line = 1; line < 18; ++line)
{
if (anArr[line][row] == 0)
{
temp = line;
while(temp < 18)
{
anArr[temp][row] = anArr[temp + 1][row];
anArr[temp + 1][row] = -1;
++temp;
}
}
if (anArr[line][row] == -1)
break;
}
}
}
else if(type == 2)
{
for (row = 1; row < 18; ++row)
{
for (line = 17; line >= 0; --line)
{
if (anArr[line][row] == 0)
{
temp = line;
while(temp >= 1)
{
anArr[temp][row] = anArr[temp - 1][row];
anArr[temp - 1][row] = -1;
--temp;
}
}
else if(anArr[line][row] == -1)
break;
}
}
}
else if(type == 3)
{
for (line = 1; line < 18; ++line)
{
for (row = 17; row >= 0; --row)
{
if (anArr[line][row] == 0)
{
temp = row;
while(temp >= 0)
{
anArr[line][temp] = anArr[line][temp - 1];
anArr[line][temp - 1] = -1;
--temp;
}
}
else if (anArr[line][row] == -1)
break;
}
}
}
else if(type == 4)
{
for (line = 1; line < 18; ++line)
{
for (row = 1; row < 18; ++row)
{
if (anArr[line][row] == 0)
{
temp = row;
while(temp < 18)
{
anArr[line][temp] = anArr[line][temp + 1];
anArr[line][temp + 1] = -1;
++temp;
}
}
else if(anArr[line][row] == -1)
break;
}
}
}
return 0;
}

int Clear()
{
int iRow = 1, iLine = 1, Row, Line;;
int temp;

for (; iLine < 18; ++iLine)
{
Next:
for (; iRow < 18; ++iRow)
{
temp = anArr[iLine][iRow];
for (Line = iLine; Line < 18; ++Line)
{
for(Row = iRow+1; Row < 18; ++Row)
{
if (temp == anArr[Line][Row])
{
anArr[Line][Row] = 0;
anArr[iLine][iRow] = 0;
iRow++;
goto Next;
}
}
}
}
}
return 0;
}

int main(void)
{
int direction = 0;
int iRow, iLine;

printf("输入靠拢方向:up(1), down(2), right(3), left(4)\n");
scanf("%d", &direction);
srand((unsigned)(time)(NULL));

/*随机添数*/
for(iRow = 1; iRow < 18; ++iRow)
for (iLine = 1; iLine < 18; ++iLine)
anArr[iLine][iRow] = rand() % (12*12);

for (iLine = 0; iLine < 19; ++iLine)
{
for(iRow = 0; iRow < 19; ++iRow)
printf("%03d,", anArr[iLine][iRow]);
printf("\n");
}
if (IfClear())
printf("两个点可以消除\n");
else
printf("两个点不可以消除\n");
/*将一样的点的值清空*/
Clear();
/*偏移*/
Direction(direction);
for (iLine = 0; iLine < 19; ++iLine)
{
for(iRow = 0; iRow < 19; ++iRow)
if(anArr[iLine][iRow] != -1)
printf("%03d,", anArr[iLine][iRow]);
else
printf("000,");
printf("\n");
}
return 0;
}
-------------------------------------------------
vc6.0 编译通过并且运行了。
应该是你要的结果。
230635800 有不明白的加我。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式