SRM385 div1 medium
眠い!
どの行とどの列をひっくり返したかと位置を状態としてBFS。
#include <string> #include <vector> #include <sstream> #include <queue> #include <utility> using namespace std; int mv[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int dist[(1<<15)][10][10]; class TurningMaze { public: bool can(char c,char d) { if(c=='B' || d=='B') return false; else if(c==d) return true; else if(c=='A' || d=='A') return true; else return false; } int minTime(vector <string> maze) { printf("\n"); fflush(stdout); int h=maze.size(),w=maze[0].size(); for(int i=0;i<(1<<15);i++) for(int j=0;j<10;j++) for(int k=0;k<10;k++) dist[i][j][k]=(1<<28); queue<pair<pair<int,int>,int> > que; que.push(make_pair(make_pair(0,0),0)); while(!que.empty()) { int m=que.front().first.first; int y=que.front().first.second/w; int x=que.front().first.second%w; int d=que.front().second; que.pop(); //printf("m=%d y=%d x=%d d=%d\n",m,y,x,d); //fflush(stdout); if(0<=y && y<h && 0<=x && x<w && d<dist[m][y][x]) { //printf("d<dist[m][y][x]\n"); //fflush(stdout); if(y==h-1 && x==w-1) return d; dist[m][y][x]=d; vector<string> vs=maze; for(int i=0;i<h;i++) if(m&(1<<i)) for(int j=0;j<w;j++) { char c=vs[i][j]; if(c=='C') vs[i][j]='D'; if(c=='D') vs[i][j]='C'; } for(int i=0;i<w;i++) if(m&(1<<i+h)) for(int j=0;j<h;j++) { char c=vs[j][i]; if(c=='C') vs[j][i]='D'; if(c=='D') vs[j][i]='C'; } //printf("convert\n"); //fflush(stdout); for(int i=0;i<4;i++) { int yy=y+mv[i][0],xx=x+mv[i][1]; if(i<2 && 0<=yy && yy<h && (vs[y][x]=='C' || vs[y][x]=='A') && (vs[yy][xx]=='C' || vs[yy][xx]=='A')) que.push(make_pair(make_pair(m,yy*w+xx),d+1)); if(1<i && 0<=xx && xx<w && (vs[y][x]=='D' || vs[y][x]=='A') && (vs[yy][xx]=='D' || vs[yy][xx]=='A')) que.push(make_pair(make_pair(m,yy*w+xx),d+1)); } int mm=m; mm=(mm^(1<<y)); mm=(mm^(1<<(x+h))); que.push(make_pair(make_pair(mm,y*w+x),d+1)); } } return -1; } };