求“扑克牌跳步”程序(c,c++),急用,分不够再加(附算法)
假定有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.