Home | Problems | Status | Contest |
Description
Input
Output
Sample Input
DICEMAZE1 3 3 1 2 5 1 -1 2 4 5 5 6 6 -1 -1 DICEMAZE2 4 7 2 6 3 6 6 4 6 0 2 6 4 1 2 -1 5 3 6 1 5 3 4 5 6 4 2 4 1 2 0 3 -1 6 DICEMAZE3 3 3 1 1 2 4 2 2 3 4 5 6 -1 -1 -1 END
Sample Output
DICEMAZE1 (1,2),(2,2),(2,3),(3,3),(3,2),(3,1),(2,1),(1,1),(1,2) DICEMAZE2 (2,6),(2,5),(2,4),(2,3),(2,2),(3,2),(4,2),(4,1),(3,1), (2,1),(2,2),(2,3),(2,4),(2,5),(1,5),(1,6),(1,7),(2,7), (3,7),(4,7),(4,6),(3,6),(2,6) DICEMAZE3 No Solution Possible
用了个bfs就过了,水题,在最后格式输出的时候错了几次,做题的时候,不防做个小正方形,这样省去了大量的想象,速度也快的多!
#include <iostream> #include <stdio.h> #include<string.h> #include<string> #include <queue> using namespace std; int row,column,up,down,n,m,left,right,front,back,startx,starty; struct mazntree{int x[7];string re;int row,colomn;}; mazntree start,p,temp; int visit[7][7][50][50]; int map[100][100]; int dir[4][2]={{0,-1},{1,0},{0,1},{-1,0}}; int init() { scanf("%d%d%d%d%d%d",&n,&m,&startx,&starty,&up,&front); if(up==1) { if(front==2) { start.x[1]=1,start.x[2]=6,start.x[3]=4,start.x[4]=3,start.x[5]=2,start.x[6]=5; } else if(front==3) { start.x[1]=1,start.x[2]=6,start.x[3]=2,start.x[4]=5,start.x[5]=3,start.x[6]=4; } else if(front==4) { start.x[1]=1,start.x[2]=6,start.x[3]=5,start.x[4]=2,start.x[5]=4,start.x[6]=3; } else if( front==5) { start.x[1]=1,start.x[2]=6,start.x[3]=3,start.x[4]=4,start.x[5]=5,start.x[6]=2; } } else if(up==2) { if(front==1) { start.x[1]=2,start.x[2]=5,start.x[3]=3,start.x[4]=4,start.x[5]=1,start.x[6]=6; } else if(front==3) { start.x[1]=2,start.x[2]=5,start.x[3]=6,start.x[4]=1,start.x[5]=3,start.x[6]=4; } else if(front==4) { start.x[1]=2,start.x[2]=5,start.x[3]=1,start.x[4]=6,start.x[5]=4,start.x[6]=3; } else if( front==6) { start.x[1]=2,start.x[2]=5,start.x[3]=4,start.x[4]=3,start.x[5]=6,start.x[6]=1; } } else if(up==3) { if(front==1) { start.x[1]=3,start.x[2]=4,start.x[3]=5,start.x[4]=2,start.x[5]=1,start.x[6]=6; } else if(front==2) { start.x[1]=3,start.x[2]=4,start.x[3]=1,start.x[4]=6,start.x[5]=2,start.x[6]=5; } else if(front==5) { start.x[1]=3,start.x[2]=4,start.x[3]=6,start.x[4]=1,start.x[5]=5,start.x[6]=2; } else if( front==6) { start.x[1]=3,start.x[2]=4,start.x[3]=2,start.x[4]=5,start.x[5]=6,start.x[6]=1; } } else if(up==4) { if(front==1) { start.x[1]=4,start.x[2]=3,start.x[3]=2,start.x[4]=5,start.x[5]=1,start.x[6]=6; } else if(front==2) { start.x[1]=4,start.x[2]=3,start.x[3]=6,start.x[4]=1,start.x[5]=2,start.x[6]=5; } else if(front==5) { start.x[1]=4,start.x[2]=3,start.x[3]=1,start.x[4]=6,start.x[5]=5,start.x[6]=2; } else if( front==6) { start.x[1]=4,start.x[2]=3,start.x[3]=5,start.x[4]=2,start.x[5]=6,start.x[6]=1; } } else if(up==5) { if(front==1) { start.x[1]=5,start.x[2]=2,start.x[3]=4,start.x[4]=3,start.x[5]=1,start.x[6]=6; } else if(front==3) { start.x[1]=5,start.x[2]=2,start.x[3]=1,start.x[4]=6,start.x[5]=3,start.x[6]=4; } else if(front==4) { start.x[1]=5,start.x[2]=2,start.x[3]=6,start.x[4]=1,start.x[5]=4,start.x[6]=3; } else if( front==6) { start.x[1]=5,start.x[2]=2,start.x[3]=3,start.x[4]=4,start.x[5]=6,start.x[6]=1; } } else if(up==6) { if(front==2) { start.x[1]=6,start.x[2]=1,start.x[3]=3,start.x[4]=4,start.x[5]=2,start.x[6]=5; } else if(front==3) { start.x[1]=6,start.x[2]=1,start.x[3]=5,start.x[4]=2,start.x[5]=3,start.x[6]=4; } else if(front==4) { start.x[1]=6,start.x[2]=1,start.x[3]=2,start.x[4]=5,start.x[5]=4,start.x[6]=3; } else if( front==5) { start.x[1]=6,start.x[2]=1,start.x[3]=4,start.x[4]=3,start.x[5]=5,start.x[6]=2; } } int i,j; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&map[i][j]); } } return 1; } bool changecan(int i)//判定能否走 { int x[7]; for( int j=1;j<7;j++) { x[j]=p.x[j]; } p.row=p.row+dir[i][0]; p.colomn=p.colomn+dir[i][1]; if((map[p.row][p.colomn]!=0)&&p.row>=1&&p.row<=n&&p.colomn>=1&&p.colomn<=m&&((p.x[1]==map[p.row][p.colomn])||(map[p.row][p.colomn]==-1)))//不越界 { if( i==0)//左移 { p.x[3]=x[1]; p.x[4]=x[2]; p.x[2]=x[3]; p.x[1]=x[4]; p.re=temp.re+'0'; } else if(i==1)//下称 { p.x[5]=x[1]; p.x[6]=x[2]; p.x[2]=x[5]; p.x[1]=x[6]; p.re=temp.re+'1'; } else if ( i==2)//右移 { p.x[4]=x[1]; p.x[3]=x[2]; p.x[1]=x[3]; p.x[2]=x[4]; p.re=temp.re+'2'; } else if (i==3)//上移 { p.x[6]=x[1]; p.x[5]=x[2]; p.x[1]=x[5]; p.x[2]=x[6]; p.re=temp.re+'3'; } if(visit[p.x[1]][p.x[5]][p.row][p.colomn]==0)//没有访问过-1能走,0不能走 { visit[p.x[1]][p.x[5]][p.row][p.colomn]=1;//标记为已访问 return true; } else return false; } else { return false; } return false; } int bfs() { queue<mazntree> q; int i,xx,yy; memset(visit ,0,sizeof(visit)); while(!q.empty())//先清空 { q.pop(); } start.re=""; start.colomn=starty; start.row=startx; q.push(start); while(!q.empty()) { temp=q.front(); q.pop(); for( i=0;i<4;i++) { p=temp; if(changecan(i)) { q.push(p); if(visit[p.x[1]][p.x[5]][p.row][p.colomn]&&(p.row==startx)&&(p.colomn==starty))//找到 { int count=0; xx=startx,yy=starty; count=1; printf(" (%d,%d),",startx,starty); for( i=0;i<p.re.length()-1;i++,count++) { xx=xx+dir[p.re[i]-'0'][0]; yy=yy+dir[p.re[i]-'0'][1]; if(count==0) printf(" "); printf("(%d,%d),",xx,yy); if(count==8) { printf("\n"); count=-1; } } xx=xx+dir[p.re[i]-'0'][0]; yy=yy+dir[p.re[i]-'0'][1]; printf("(%d,%d)\n",xx,yy); return 1; } } } } printf(" No Solution Possible\n"); return -1; } int main() { char str[200]; while(1) { gets(str); if(str[0]=='E'&&str[1]=='N'&&str[2]=='D') break; init(); printf("%s\n",str); gets(str);//把最后的回车吸收 bfs(); } return 0; }