题目大意:滚骰子游戏,骰子的上面的点数跟方格中的数相同时或格子中的数是-1时能把格子滚过去,找一条从起点滚到起点的路径。
题目大意:简单BFS,状态转移时细心一些即可。
代码如下;
# include<iostream> # include<cstdio> # include<map> # include<string> # include<queue> # include<cstring> # include<algorithm> using namespace std; struct Node { int x,y,s,t; string px,py; Node(int _x,int _y,int _s,int _t,string _px,string _py):x(_x),y(_y),s(_s),t(_t),px(_px),py(_py){} bool operator < (const Node &a) const { return t>a.t; } }; int Left[50],Right[50],vis[10][10][50],mp[10][10],r,c; int behind[6]={6,5,4,3,2,1}; int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; string name; void init() { Left[9]=4,Right[9]=3; Left[12]=3,Right[12]=4; Left[10]=2,Right[10]=5; Left[11]=5,Right[11]=2; Left[15]=3,Right[15]=4; Left[20]=4,Right[20]=3; Left[18]=1,Right[18]=6; Left[17]=6,Right[17]=1; Left[22]=5,Right[22]=2; Left[27]=2,Right[27]=5; Left[23]=1,Right[23]=6; Left[26]=6,Right[26]=1; Left[29]=2,Right[29]=5; Left[34]=5,Right[34]=2; Left[30]=6,Right[30]=1; Left[33]=1,Right[33]=6; Left[36]=4,Right[36]=3; Left[41]=3,Right[41]=4; Left[38]=1,Right[38]=6; Left[39]=6,Right[39]=1; Left[44]=3,Right[44]=4; Left[47]=4,Right[47]=3; Left[46]=2,Right[46]=5; Left[45]=5,Right[45]=2; } bool ok(int x,int y) { return x>=0&&x<r&&y>=0&&y<c; } void bfs(int sx,int sy,int ss) { priority_queue<Node>q; memset(vis,0,sizeof(vis)); string path=""; q.push(Node(sx,sy,ss,0,path+(char)(sx+'A'),path+(char)(sy+'A'))); while(!q.empty()) { Node u=q.top(); q.pop(); if(u.t&&u.x==sx&&u.y==sy){ int l=u.px.size(); for(int i=0;i<l;++i){ if(i==0) printf(" "); printf("(%d,%d)",u.px[i]-'A'+1,u.py[i]-'A'+1); if(i==l-1) printf(" "); else if(i%9==8) printf(", "); else printf(","); } return ; } int dd[4]={u.s%7,behind[u.s%7-1],Right[u.s],Left[u.s]}; for(int i=0;i<4;++i){ int nx=u.x+d[i][0],ny=u.y+d[i][1]; if(ok(nx,ny)&&(mp[nx][ny]==(u.s/7)||mp[nx][ny]==-1)){ int k=u.s%7; if(i==0) k=behind[u.s/7-1]; if(i==1) k=u.s/7; if(!vis[nx][ny][dd[i]*7+k]){ vis[nx][ny][dd[i]*7+k]=1; q.push(Node(nx,ny,dd[i]*7+k,u.t+1,u.px+(char)(nx+'A'),u.py+(char)(ny+'A'))); } } } } printf(" No Solution Possible "); } int main() { //freopen("UVA-810 A Dicey Problem.txt","r",stdin); int sx,sy,st,sf; init(); while(cin>>name) { if(name=="END") break; scanf("%d%d%d%d%d%d",&r,&c,&sx,&sy,&st,&sf); for(int i=0;i<r;++i) for(int j=0;j<c;++j) scanf("%d",&mp[i][j]); cout<<name<<endl; bfs(sx-1,sy-1,st*7+sf); } return 0; }