用蠢行线路画需要的纸张太多,一张图加文字看你能不能看明白吧。
假设从左到右的三个箱子号码为1、2、3,三个目的地号码为4、5、6,其他需要用的几个地方分别按标的数字编码。
首先把3号箱子推到7号位置,这样利用了右下角唯一的空地,可以进行周转。然后把1号箱子推到11号位早如置,这样是为了随时保证整个地图是可以转圈畅通的,然后把1号箱子再推到8号位置。继续把2号箱子推到9号位置,把1号箱子推到原来2号箱子的位置,这样图仍然是畅通的。把2号箱子推到10号位置,然后推到5号目的地,这是三个目的地中最难的,先解决它。继续把1号箱子推到9号位置,然后推到最顶陆档启上,然后推到4号目的地。此时全图仍然是畅通的,可以把最后的3号箱子推到6号目的地了。完成。
下面是stopheart版主在魔方吧推箱子子论坛发表的:箱子的技巧:
1、推箱子要掌握好次序-井然有序
2、发现空位,用改行来倒腾(腾挪)箱子
3、.建立通路,不要轻易封死一个通路
4、死锁问题,死锁的含义是推到箱子就动不了,
或无论如何也无法将箱子推到目标点。
要过关, 当然和改是无论如何你也不想看到死锁的情况出现。
5、耐核棚哗心
给你一个TC版本的吧郑做兆宴,VC版本的CSDN上可以下载:#include <dos.h>
#include <stdio.h>
#include <ctype.h>
#include <喊猜衡conio.h>
#include <bios.h>
#include <alloc.h>
typedef struct winer
{
int x,y
struct winer *p
}winer
char status [20][20]
char far *printScreen=(char far* )0xB8000000
void putoutChar(int y,int x,char ch,char fc,char bc)
void printWall(int x, int y)
void printBox(int x, int y)
void printBoxDes(int x, int y)
void printDestination(int x, int y)
void printDestination1(int x,int y,winer **win,winer **pw)
void printMan(int x, int y)
void init()
winer *initStep1()
winer *initStep2()
winer *initStep3()
winer *initStep4()
void moveBoxSpacetoSpace(int x ,int y, char a)
void moveBoxDestoSpace(int x ,int y, char a)
void moveBoxSpacetoDes(int x, int y, char a)
void moveBoxDestoDes(int x, int y, char a)
int judge(int x, int y)
void move(int x, int y, char a)
void reset(int i)
void putoutChar(int y,int x,char ch,char fc,char bc)
{
printScreen[(x*160)+(y<<1)+0]=ch
printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc
}
void printWall(int x,int y)
{
putoutChar(y-1,x-1,219,GREEN,BLACK)
status[x][y]='w'
}
void printBox(int x,int y)
{
putoutChar(y-1,x-1,10,WHITE,BLACK)
status[x][y]='b'
}
void printDestination1(int x,int y,winer **win,winer **pw)
{
winer *qw
putoutChar(y-1,x-1,003,YELLOW,BLACK)
status[x][y]='m'
if(*win==NULL)
{
*win=*pw=qw=(winer* )malloc(sizeof(winer))
(*pw)->x=x
(*pw)->y=y
(*pw)->p=NULL
}
else
{
qw=(winer* )malloc(sizeof(winer))
qw->x=x
qw->y=y
(*pw)->p=qw
(*pw)=qwqw->p=NULL
}
}
void printDestination(int x,int y)
{
putoutChar(y-1,x-1,003,YELLOW,BLACK)
status[x][y]='m'
}
void printMan(int x,int y)
{
gotoxy(y,x)
_AL=02
_CX=01
_AH=0xa
geninterrupt(0x10)
}
void printBoxDes(int x,int y)
{
putoutChar(y-1,x-1,10,YELLOW,BLACK)
status[x][y]='i'
}
void init()
{
int i,j
for(i=0i<20i++)
for(j=0j<20j++)
status[i][j]=0
_AL=3
_AH=0
geninterrupt(0x10)
gotoxy(41,4)
printf(" --------- up")
gotoxy(41,6)
printf(" --------- down")
gotoxy(41,8)
printf(" --------- left")
gotoxy(41,10)
printf(" --------- right")
gotoxy(40,12)
printf("Space ----- reset")
gotoxy(40,14)
printf("Esc ------- quit")
gotoxy(18,24)
printf("CopyRight: 2008 LuoFuxing")
gotoxy(40,4)
_CX=01
_AH=0xa
_AL=24
geninterrupt(0x10)
gotoxy(40,6)
_CX=01
_AH=0xa
_AL=25
geninterrupt(0x10)
gotoxy(40,8)
_CX=01
_AH=0xa
_AL=27
geninterrupt(0x10)
gotoxy(40,10)
_CX=01
_AH=0xa
_AL=26
geninterrupt(0x10)
}
winer *initStep1()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(25,2)
printf("Level 1")
for(x=1,y=5y<=9y++)
printWall(x+4,y+10)
for(y=5,x=2x<=5x++)
printWall(x+4,y+10)
for(y=9,x=2x<=5x++)
printWall(x+4,y+10)
for(y=1,x=3x<=8x++)
printWall(x+4,y+10)
for(x=3,y=3x<=5x++)
printWall(x+4,y+10)
for(x=5,y=8x<=9x++)
printWall(x+4,y+10)
for(x=7,y=4x<=9x++)
printWall(x+4,y+10)
for(x=9,y=5y<=7y++)
printWall(x+4,y+10)
for(x=8,y=2y<=3y++)
printWall(x+4,y+10)
printWall(5+4,4+10)
printWall(5+4,7+10)
printWall(3+4,2+10)
printBox(3+4,6+10)
printBox(3+4,7+10)
printBox(4+4,7+10)
printDestination1(4+4,2+10,&win,&pw)
printDestination1(5+4,2+10,&win,&pw)
printDestination1(6+4,2+10,&win,&pw)
printMan(2+4,8+10)
return win
}
winer *initStep2()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(25,2)
printf("Level 2")
for(x=1,y=4y<=7y++)
printWall(x+4,y+10)
for(x=2,y=2y<=4y++)
printWall(x+4,y+10)
for(x=2,y=7x<=4x++)
printWall(x+4,y+10)
for(x=4,y=1x<=8x++)
printWall(x+4,y+10)
for(x=8,y=2y<=8y++)
printWall(x+4,y+10)
for(x=4,y=8x<=8x++)
printWall(x+4,y+10)
for(x=4,y=6x<=5x++)
printWall(x+4,y+10)
for(x=3,y=2x<=4x++)
printWall(x+4,y+10)
for(x=4,y=4x<=5x++)
printWall(x+4,y+10)
printWall(6+4,3+10)
printBox(3+4,5+10)
printBox(6+4,6+10)
printBox(7+4,3+10)
printDestination1(5+4,7+10,&win,&pw)
printDestination1(6+4,7+10,&win,&pw)
printDestination1(7+4,7+10,&win,&pw)
printMan(2+4,6+10)
return win
}
winer *initStep3()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(25,2)
printf("Level 3")
for(x=1,y=2y<=8y++)
printWall(x+4,y+10)
for(x=2,y=2x<=4x++)
printWall(x+4,y+10)
for(x=4,y=1y<=3y++)
printWall(x+4,y+10)
for(x=5,y=1x<=8x++)
printWall(x+4,y+10)
for(x=8,y=2y<=5y++)
printWall(x+4,y+10)
for(x=5,y=5x<=7x++)
printWall(x+4,y+10)
for(x=7,y=6y<=9y++)
printWall(x+4,y+10)
for(x=3,y=9x<=6x++)
printWall(x+4,y+10)
for(x=3,y=6y<=8y++)
printWall(x+4,y+10)
printWall(2+4,8+10)
printWall(5+4,7+10)
printBox(6+4,3+10)
printBox(4+4,4+10)
printBox(5+4,6+10)
printDestination1(2+4,5+10,&win,&pw)
printDestination1(2+4,6+10,&win,&pw)
printDestination1(2+4,7+10,&win,&pw)
printMan(2+4,4+10)
return win
}
winer *initStep4()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(23,2)
printf("The Last Level")
for(x=1,y=1y<=6y++)
printWall(x+4,y+10)
for(x=2,y=7y<=8y++)
printWall(x+4,y+10)
for(x=2,y=1x<=7x++)
printWall(x+4,y+10)
for(x=7,y=2y<=4y++)
printWall(x+4,y+10)
for(x=6,y=4y<=9y++)
printWall(x+4,y+10)
for(x=3,y=9x<=5x++)
printWall(x+4,y+10)
for(x=3,y=3y<=4y++)
printWall(x+4,y+10)
printWall(3+4,8+10)
printBox(3+4,5+10)
printBox(4+4,4+10)
printBox(4+4,6+10)
printBox(5+4,5+10)
printBox(5+4,3+10)
printDestination1(3+4,7+10,&win,&pw)
printDestination1(4+4,7+10,&win,&pw)
printDestination1(5+4,7+10,&win,&pw)
printDestination1(4+4,8+10,&win,&pw)
printDestination1(5+4,8+10,&win,&pw)
printMan(2+4,2+10)
return win
}
void moveBoxSpacetoSpace(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]=0
printf(" ")
printBox(x-2,y)
printMan(x-1,y)
status[x-2][y]='b'
break
case 'd':
status[x+1][y]=0
printf(" ")
printBox(x+2,y)
printMan(x+1,y)
status[x+2][y]='b'
break
case 'l':
status[x][y-1]=0
printf(" ")
printBox(x,y-2)
printMan(x,y-1)
status[x][y-2]='b'
break
case 'r':
status[x][y+1]=0
printf(" ")
printBox(x,y+2)
printMan(x,y+1)
status[x][y+2]='b'
break
default:
break
}
}
void moveBoxDestoSpace(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]='m'
printf(" ")
printBox(x-2,y)
printMan(x-1,y)
status[x-2][y]='b'
break
case 'd':
status[x+1][y]='m'
printf(" ")
printBox(x+2,y)
printMan(x+1,y)
status[x+2][y]='b'
break
case 'l':
status[x][y-1]='m'
printf(" ")
printBox(x,y-2)
printMan(x,y-1)
status[x][y-2]='b'
break
case 'r':
status[x][y+1]='m'
printf(" ")
printBox(x,y+2)
printMan(x,y+1)
status[x][y+2]='b'
break
default:
break
}
}
void moveBoxSpacetoDes(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]=0
printf(" ")
printBoxDes(x-2,y)
printMan(x-1,y)
status[x-2][y]='i'
break
case 'd':
status[x+1][y]=0
printf(" ")
printBoxDes(x+2,y)
printMan(x+1,y)
status[x+2][y]='i'
break
case 'l':
status[x][y-1]=0
printf(" ")
printBoxDes(x,y-2)
printMan(x,y-1)
status[x][y-2]='i'
break
case 'r':
status[x][y+1]=0
printf(" ")
printBoxDes(x,y+2)
printMan(x,y+1)
status[x][y+2]='i'
break
default:
break
}
}
void moveBoxDestoDes(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]='m'
printf(" ")
printBoxDes(x-2,y)
printMan(x-1,y)
status[x-2][y]='i'
break
case 'd':
status[x+1][y]='m'
printf(" ")
printBoxDes(x+2,y)
printMan(x+1,y)
status[x+2][y]='i'
break
case 'l':
status[x][y-1]='m'
printf(" ")
printBoxDes(x,y-2)
printMan(x,y-1)
status[x][y-2]='i'
break
case 'r':
status[x][y+1]='m'
printf(" ")
printBoxDes(x,y+2)
printMan(x,y+1)
status[x][y+2]='i'
break
default:
break
}
}
int judge(int x,int y)
{
int i
switch(status[x][y])
{
case 0:
i=1
break
case 'w':
i=0
break
case 'b':
i=2
break
case 'i':
i=4
break
case 'm':
i=3
break
default:
break
}
return i
}
void move(int x,int y,char a)
{
switch(a)
{
case 'u':
if(!judge(x-1,y))
{
gotoxy(y,x)
break
}
else if(judge(x-1,y)==1||judge(x-1,y)==3)
{
if(judge(x,y)==3)
{
printDestination(x,y)
printMan(x-1,y)
break
}
else
{
printf(" ")
printMan(x-1,y)
break
}
}
else if(judge(x-1,y)==2)
{
if(judge(x-2,y)==1)
{
moveBoxSpacetoSpace(x,y,'u')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x-1)
}
else if(judge(x-2,y)==3)
{
moveBoxSpacetoDes(x,y,'u')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x-1)
}
else
gotoxy(y,x)
break
}
else if(judge(x-1,y)==4)
{
if(judge(x-2,y)==1)
{
moveBoxDestoSpace(x,y,'u')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x-1)
}
else if(judge(x-2,y)==3)
{
moveBoxDestoDes(x,y,'u')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x-1)
}
else
gotoxy(y,x)
break
}
case 'd':
if(!judge(x+1,y))
{
gotoxy(y,x)
break
}
else if(judge(x+1,y)==1||judge(x+1,y)==3)
{
if(judge(x,y)==3)
{
printDestination(x,y)
printMan(x+1,y)
break
}
else
{
printf(" ")
printMan(x+1,y)
break
}
}
else if(judge(x+1,y)==2)
{
if(judge(x+2,y)==1)
{
moveBoxSpacetoSpace(x,y,'d')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x+1)
}
else if(judge(x+2,y)==3)
{
moveBoxSpacetoDes(x,y,'d')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x+1)
}
else
gotoxy(y,x)
break
}
else if(judge(x+1,y)==4)
{
if(judge(x+2,y)==1)
{
moveBoxDestoSpace(x,y,'d')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x+1)
}
else if(judge(x+2,y)==3)
{
moveBoxDestoDes(x,y,'d')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x+1)
}
else
gotoxy(y,x)
break
}
case 'l':
if(!judge(x,y-1))
{
gotoxy(y,x)
break
}
else if(judge(x,y-1)==1||judge(x,y-1)==3)
{
if(judge(x,y)==3)
{
printDestination(x,y)
printMan(x,y-1)
break
}
else
{
printf(" ")
printMan(x,y-1)
break
}
}
else if(judge(x,y-1)==2)
{
if(judge(x,y-2)==1)
{
moveBoxSpacetoSpace(x,y,'l')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y-1,x)
}
else if(judge(x,y-2)==3)
{
moveBoxSpacetoDes(x,y,'l')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y-1,x)
}
else
gotoxy(y,x)
break
}
else if(judge(x,y-1)==4)
{
if(judge(x,y-2)==1)
{
moveBoxDestoSpace(x,y,'l')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y-1,x)
}
else if(judge(x,y-2)==3)
{
moveBoxDestoDes(x,y,'l')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y-1,x)
}
else
gotoxy(y,x)
break
}
case 'r':
if(!judge(x,y+1))
{
gotoxy(y,x)
break
}
else if(judge(x,y+1)==1||judge(x,y+1)==3)
{
if(judge(x,y)==3)
{
printDestination(x,y)
printMan(x,y+1)
break
}
else
{
printf(" ")
printMan(x,y+1)
break
}
}
else if(judge(x,y+1)==2)
{
if(judge(x,y+2)==1)
{
moveBoxSpacetoSpace(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else if(judge(x,y+2)==3)
{
moveBoxSpacetoDes(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else
gotoxy(y,x)
break
}
else if(judge(x,y+1)==4)
{
if(judge(x,y+2)==1)
{
moveBoxDestoSpace(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else if(judge(x,y+2)==3)
{
moveBoxDestoDes(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else
gotoxy(y,x)
break
}
default:
break
}
}
void reset(int i)
{
switch(i)
{
case 0:
init()
initStep1()
break
case 1:
init()
initStep2()
break
case 2:
init()
initStep3()
break
case 3:
init()
initStep4()
break
default:
break
}
}
void main()
{
int key
int x
int y
int s
int i=0
winer *win
winer *pw
_AL=3
_AH=0
geninterrupt(0x10)
init()
win=initStep1()
do{
_AH=3
geninterrupt(0x10)
x=_DH+1
y=_DL+1
while(bioskey(1)==0)
key=bioskey(0)
switch(key)
{
case 0x4800:
move(x,y,'u')
break
case 0x5000:
move(x,y,'d')
break
case 0x4b00:
move(x,y,'l')
break
case 0x4d00:
move(x,y,'r')
break
case 0x3920:
reset(i)
break
default:
break
}
s=0
pw=win
while(pw)
{
if(status[pw->x][pw->y]=='m')
s++
pw=pw->p
}
if(s==0)
{
free(win)
gotoxy(15,20)
printf("congratulate! You have done this step!")
getch()
i++
switch(i)
{
case 1:
init()
win=initStep2()
break
case 2:
init()
win=initStep3()
break
case 3:
init()
win=initStep4()
break
case 4:
gotoxy(15,21)
printf("Congratulation! \n")
gotoxy(15,22)
printf("You have done all the steps, You are very clever!")
key=0x011b
getch()
break
default:
break
}
}
}while(key!=0x011b)
_AL=3
_AH=0
geninterrupt(0x10)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)