---恢复内容开始---
http://poj.org/problem?id=3322
题意:http://jandan.net/2008/01/24/bloxorz.html就是这个鬼游戏
我也是郁闷了,昨天就看到一道连连看的题目,今天就是这个游戏。都懵逼了。
思路:这个游戏的难度主要是在于它是第一个长方体,而不是一个正方体,不过是正方体也就不存在这个游戏了,所以我们要想办法来标记它。
我首先定义了这个长方体有三种状态。
对于第一种状态来说,它是的底面是一个正方形,四边都是一个长方形。
第二种状态,底面是一个竖直摆放的一个长方形。
第三种状态, 底面是一个水平摆放的一个长方形。
定义状态有利于对这个长方体进行操作。
定义状态后,我们要标记它是否通过某个点。
1我定义为在那个长方体在那个点是立起来的。也就是那个长方体与地面接触的点这有这个点
2我定义为这个点没有和这个点上面的那个点同时被占用。
3我定义为这个点没有和这个点右边的那个点同时被占用。
4我定义为这个点没有和这个店下面的那个点同时被占用。
5我定义为这个点没有和这个点左边的那个点同时被占用。
这样定义的话,你就可以判断这个长方体是不是第一次以这样的方式通过这个点。
同时被占用意思是这个长方体同时出现在这个点和相邻的那个点。
1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 5 using namespace std; 6 7 8 char mp[600][600]; 9 10 bool mark[600][600][6]; 11 12 struct note{ 13 int x,y,state,step,x1,y1; 14 }p,tmp; 15 queue <note >q; 16 17 int ex,ey,ex1,ey1,m,n,kind; //因为这个题目最开始我想错了,我是把O看成起点,X看成终点,所以我的搜索方向是反过来的,不过这个无所谓,因为从O到X和从X到O的最短路一定是一样的。 18 19 int bfs(int x,int y,int z) 20 { 21 p.x=x; 22 p.y=y; 23 p.state=z; 24 p.step=0; 25 p.x1=x; 26 p.y1=y; 27 mark[p.x][p.y][1]=false; 28 q.push(p); 29 while(!q.empty()) 30 { 31 tmp=q.front(); 32 q.pop(); 33 if(kind==1&&tmp.state==1&&tmp.x==ex&&tmp.y==ey) { //这个是因为长方体可能不是立着放的,所以我反过来的话,那么它到达终点也有可能不是立着的。 34 return tmp.step; 35 }else { 36 if(tmp.x==ex&&tmp.x1==ex1&&tmp.y==ey&&tmp.y1==ey1) 37 return tmp.step; 38 } 39 if(tmp.state==1){ 40 if(mark[tmp.x+1][tmp.y][4]&&mp[tmp.x+1][tmp.y]!=‘#‘&&mp[tmp.x+2][tmp.y]!=‘#‘&&tmp.x<=m-2){ //判断,它不能超过边界,mark[4]是因为,x+2是x+1在x+1的下面,所以判断一次这样的
走过没有,没走过就可以走一次,走过之后把X+1的mark[4]标记和x+2的mark[2]标记就可以了。
41 p.state=2; 42 p.x=tmp.x+1; 43 p.x1=tmp.x+2; 44 p.step=tmp.step+1; 45 p.y=tmp.y; 46 p.y1=tmp.y; 47 mark[tmp.x+1][tmp.y][4]=false; 48 mark[tmp.x+2][tmp.y][2]=false; 49 q.push(p); 50 } 51 if(mark[tmp.x-1][tmp.y][2]&&mp[tmp.x-1][tmp.y]!=‘#‘&&mp[tmp.x-2][tmp.y]!=‘#‘&&tmp.x>=3){ 52 p.state=2; 53 p.x=tmp.x-2; 54 p.x1=tmp.x-1; 55 p.step=tmp.step+1; 56 p.y=tmp.y; 57 p.y1=tmp.y; 58 mark[tmp.x-1][tmp.y][2]=false; 59 mark[tmp.x-2][tmp.y][4]=false; 60 q.push(p); 61 } 62 if(mark[tmp.x][tmp.y+1][3]&&mp[tmp.x][tmp.y+1]!=‘#‘&&mp[tmp.x][tmp.y+2]!=‘#‘&&tmp.y<=n-2){ 63 p.state=3; 64 p.x=tmp.x; 65 p.x1=tmp.x; 66 p.step=tmp.step+1; 67 p.y=tmp.y+1; 68 p.y1=tmp.y+2; 69 mark[tmp.x][tmp.y+1][3]=false; 70 mark[tmp.x][tmp.y+2][5]=false; 71 q.push(p); 72 }if(mark[tmp.x][tmp.y-1][5]&&mp[tmp.x][tmp.y-1]!=‘#‘&&mp[tmp.x][tmp.y-2]!=‘#‘&&tmp.y>=3){ 73 p.state=3; 74 p.x=tmp.x; 75 p.x1=tmp.x; 76 p.step=tmp.step+1; 77 p.y=tmp.y-2; 78 p.y1=tmp.y-1; 79 mark[tmp.x][tmp.y-1][5]=false; 80 mark[tmp.x][tmp.y-2][3]=false; 81 q.push(p); 82 } 83 } 84 if(tmp.state==2){ 85 if(mark[tmp.x-1][tmp.y][1]&&(mp[tmp.x-1][tmp.y]==‘.‘||mp[tmp.x-1][tmp.y]==‘X‘)&&tmp.x-1>=1){ //这个因为是立着放,所以下一个点只可以是‘.’不能是E 86 p.state=1; 87 p.x=tmp.x-1; 88 p.x1=tmp.x-1; 89 p.step=tmp.step+1; 90 p.y=tmp.y; 91 p.y1=tmp.y1; 92 mark[tmp.x-1][tmp.y][1]=false; 93 q.push(p); 94 } 95 if(mark[tmp.x1+1][tmp.y][1]&&(mp[tmp.x1+1][tmp.y]==‘.‘||mp[tmp.x1+1][tmp.y]==‘X‘)&&tmp.x1+1<=m){ 96 p.state=1; 97 p.x=tmp.x1+1; 98 p.x1=tmp.x1+1; 99 p.step=tmp.step+1; 100 p.y=tmp.y; 101 p.y1=tmp.y1; 102 mark[tmp.x1+1][tmp.y][1]=false; 103 q.push(p); 104 } 105 if(mark[tmp.x][tmp.y-1][4]&&mp[tmp.x][tmp.y-1]!=‘#‘&&mp[tmp.x1][tmp.y-1]!=‘#‘&&tmp.y-1>=1){ 106 p.state=2; 107 p.x=tmp.x; 108 p.x1=tmp.x1; 109 p.step=tmp.step+1; 110 p.y=tmp.y-1; 111 p.y1=tmp.y-1; 112 mark[tmp.x][tmp.y-1][4]=false; 113 mark[tmp.x1][tmp.y-1][2]=false; 114 q.push(p); 115 } 116 if(mark[tmp.x][tmp.y+1][4]&&mp[tmp.x][tmp.y1+1]!=‘#‘&&mp[tmp.x1][tmp.y+1]!=‘#‘&&tmp.y+1<=n){ 117 p.state=2; 118 p.x=tmp.x; 119 p.x1=tmp.x1; 120 p.step=tmp.step+1; 121 p.y=tmp.y+1; 122 p.y1=tmp.y1+1; 123 mark[tmp.x][tmp.y+1][4]=false; 124 mark[tmp.x1][tmp.y+1][2]=false; 125 q.push(p); 126 } 127 } 128 if(tmp.state==3) 129 { 130 if(mark[tmp.x-1][tmp.y][3]&&mp[tmp.x-1][tmp.y]!=‘#‘&&mp[tmp.x-1][tmp.y1]!=‘#‘&&tmp.x-1>=1){ 131 p.state=3; 132 p.x=tmp.x-1; 133 p.x1=tmp.x1-1; 134 p.step=tmp.step+1; 135 p.y=tmp.y; 136 p.y1=tmp.y1; 137 mark[tmp.x-1][tmp.y][3]=false; 138 mark[tmp.x-1][tmp.y1][5]=false; 139 q.push(p); 140 } 141 if(mark[tmp.x+1][tmp.y][3]&&mp[tmp.x+1][tmp.y]!=‘#‘&&mp[tmp.x+1][tmp.y1]!=‘#‘&&tmp.x1+1<=m){ 142 p.state=3; 143 p.x=tmp.x1+1; 144 p.x1=tmp.x1+1; 145 p.step=tmp.step+1; 146 p.y=tmp.y; 147 p.y1=tmp.y1; 148 mark[tmp.x+1][tmp.y][3]=false; 149 mark[tmp.x+1][tmp.y1][5]=false; 150 } 151 if(mark[tmp.x][tmp.y-1][1]&&(mp[tmp.x][tmp.y-1]==‘.‘||mp[tmp.x][tmp.y-1]==‘X‘)&&tmp.y-1>=1){ 152 p.state=1; 153 p.x=tmp.x; 154 p.x1=tmp.x1; 155 p.step=tmp.step+1; 156 p.y=tmp.y-1; 157 p.y1=tmp.y-1; 158 mark[tmp.x][tmp.y-1][1]=false; 159 q.push(p); 160 } 161 if(mark[tmp.x][tmp.y1+1][1]&&(mp[tmp.x][tmp.y1+1]==‘.‘||mp[tmp.x][tmp.y1+1]==‘X‘)&&tmp.y1+1<=n){ 162 p.state=1; 163 p.x=tmp.x; 164 p.x1=tmp.x1; 165 p.step=tmp.step+1; 166 p.y=tmp.y1+1; 167 p.y1=tmp.y1+1; 168 mark[tmp.x][tmp.y1+1][1]=false; 169 q.push(p); 170 } 171 } 172 } 173 174 return 0; 175 } 176 177 int main() 178 { 179 int x,y; 180 while(scanf("%d%d",&m,&n),m||n) 181 { 182 memset(mark,true,sizeof(mark)); 183 memset(mp,0,sizeof(mp)); 184 getchar(); 185 kind=0; 186 for(int i=1;i<=m;i++){ 187 for(int j=1;j<=n;j++) 188 { 189 scanf("%c",&mp[i][j]); 190 // printf("%c",mp[i][j]); 191 if(mp[i][j]==‘O‘) 192 { 193 x=i,y=j; 194 } 195 if(mp[i][j]==‘X‘) 196 { 197 if(kind==0){ ex=i;ey=j;kind++;} 198 else { 199 ex1=i;ey1=j;kind++; 200 } 201 } 202 } 203 getchar(); 204 } 205 while(!q.empty()) 206 q.pop(); 207 int ans=bfs(x,y,1); 208 if(ans!=0) printf("%d\n",ans); 209 else printf("Impossible\n"); 210 } 211 return 0; 212 }
原文:http://www.cnblogs.com/Tree-dream/p/5719697.html