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;
		}
};