求“扑克牌跳步”程序(c,c++),急用,分不够再加(附算法)

chen_funer 2002-12-13 04:47:50
假定有32张牌像图6.17那样摆在有33格的盘上(抱歉,不能贴图 :< 即:四个角分别拿掉一个2×2的正方形),只有中心格空着。现规定当一张牌跳过邻近的牌到盘
空格时,就将这张牌从盘上拿掉。写一个算法来找出
一系列跳步,使除了最后留在中心格上的一张牌外,
其余的牌均被拿掉。

一.算法设计 图6.17
procedure POKER
1 2 3 4 5 6 7
1
2
3
4
5
6
7
//此盘只有33格,但盘的行和列的最大值均为7,因此可将此盘扩放到一个7×7的盘中,其图形如右图。如果一张牌能向当前行或列进行跳步,并且能将最后一张牌跳到中心格,则打印这一系列跳步;否则进行回朔,直到能满足要求为止。预先将盘中放有牌的格设置为1,没有牌的格设置为0。//
integer x, m, n, A(x);
type M[x, A(x)]=array [1..y, 1..y] of integer ;
int m:=1; n:=1; //m,n作为判断是否只剩一张牌//
x:=1; A(x):=1; //x是当前行,A(x)是当前列//
(将盘中有牌的格设置为1,无牌格设置为0;)
while x=1 to 7 and A(x)=1 to 7 do
if x=1,2,6,7 then A(x)=3,4,5
else A(x)=1,2,6,7
if A(x)>7 then writeln ( ' 超界了' );
else do
if M[x, A(x)]=1, M[x, A(x)+1]=1 M[x, A(x)+2]=0 //判断能否跳跃//
or M[x, A(x)]=0, M[x, A(x)+1]=1, M[x, A(x)+2]=1,
then M[x, A(x)+1]:=0 //拿掉邻近一张牌//
M[x, A(x)]:=0 //将M[x, A(x)]置0,视为这张牌已经跳走//
M[x, A(x)+2]:=1 // M[x, A(x)+2]置0,表示该格接受跳跃而来的牌,变为有牌格//
Next x; //移到下一行//
Next A(x); //移到下一列//
Else Goto a:
If x>5 then writlen( ' 超界了 ' )
Else if M[x, A(x)]=0, M[x+1, A(x)]=1, M[x+2, A(x)]=1;
Or M[x, A(x)]=1, M[x+1, A(x)]=1, M[x+2, A(x)]=0;
Then M[x, A(x)]:=0;
Next A(x);
Next x;
Else Goto a:
Endif;
Endif;
Repeat;
a: if M[x, A(x)]=1 and M[x+m, A(x)+n]=0 //只剩一张牌吗//
m:=m+1;
n:=n+1;
until m=6; n=6; //检测到行、列的最大值//
then if x=4 and A(x)=4 //最后一张牌在中心格吗//
else x:=x-1; //回朔//
endif;
endif;
end poker.
...全文
43 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_funer 2002-12-13
  • 打赏
  • 举报
回复
以上是我写的递归调用代码,不过不知道为什么没有输出,cup一直100%工作,请各位高手帮忙看看,谢谢了先!!

急急!!
明天就是低线了
chen_funer 2002-12-13
  • 打赏
  • 举报
回复
public int Path()
{
for(int i = 0;i < 5;i++)
for(int j = 0;j < 5;j++)
{
//横向
if(((pk[i,j]==1)&&(pk[i,j+1]==1)&&(pk[i,j+2]==0))||((pk[i,j]==0)&&(pk[i,j+1]==1)&&(pk[i,j+2]==1)))
{
for(int a=j;a<=j+2;a++) //跳步,0~1互换
{
if(pk[i,a]==0)
pk[i,a] = 1;
else
pk[i,a] = 0;
}

int count = 0; //计数清0
for(int x=0;x<7;x++)
for(int y=0;y<7;y++) //判断跳步后剩下的牌数
{
if(pk[x,y]==1)
count++;
}
if((count==1)&&(pk[3,3]==1)) //只剩下一张牌,并且在棋盘中央
{
return 1;
}
else if(Path()==1) //如果不能满足条件,递归调用
{
return 1;
}
else if(Path()==0) //返回0表明此次跳步之后(不满足条件),poker不能再跳步
//else
{
for(int a=j;a<=j+2;a++) //重置跳步
{
if(pk[i,a]==0)
pk[i,a] = 1;
else
pk[i,a] = 0;
}
}
}

//纵向
if(((pk[i,j]==1)&&(pk[i+1,j]==1)&&(pk[i+2,j]==0))||((pk[i,j]==0)&&(pk[i+1,j]==1)&&(pk[i+2,j]==1)))
{
for(int b=i;b<=i+2;b++) //跳步
{
if(pk[b,j]==0)
pk[b,j] = 1;
else
pk[b,j] = 0;
}
int count = 0; //计数清0
for(int x=0;x<7;x++)
for(int y=0;y<7;y++) //判断跳步后剩下的牌数
{
if(pk[x,y]==1)
count++;
}
if((count==1)&&(pk[3,3]==1)) //只剩下一张牌,并且在棋盘中央
{
return 1;
}
else if(Path()==1) //如果不能满足条件,递归调用
{
return 1;
}
//else if(Path()==0) //返回0表明此次跳步之后(不满足条件),poker不能再跳步
else
{
for(int b=i;b<=i+2;b++) //跳步重置
{
if(pk[b,j]==0)
pk[b,j] = 1;
else
pk[b,j] = 0;
}
}
}
}
return 0;
}
chen_funer 2002-12-13
  • 打赏
  • 举报
回复
我仔细想了一下,觉得算法有点问题,请大家自己想想吧
可以仿照迷宫算法那样用递归解决,以上是老师给的解题思路,只是伪代码,的确有些问题,不过方向可以借鉴
and
星期六是低限,帮忙想想办法吧
thanks 请跟贴吧,高手们!!

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧