代码方面么……自己喜欢设计点class,估计看上去好理解一些哈~~
#include<iostream>
using namespace std;

enum Direction
{North,East,South,West};
typedef struct
{int x,y;Direction d;}Point;
class Map

{
public:
Map();
int meet();
void move();
int seconds;
private:
int item[10][10];
Point Cat,Mouse;
void Fill(char s,int x,int y);
int movable(Point& pos);
};
int main()

{
int data;
cin>>data;
Map* m;
while(data-- > 0)
{
m=new Map();
while(!m->meet())
{
m->move();
if(m->seconds>160000l)
{
m->seconds = -1;
break;
}
}
cout<<m->seconds<<endl;
}
return 0;
}
Map::Map()

{
char s[10];
int count1,count2;
for(count1=0;count1<10;count1++)
{
cin>>s;
for(count2=0;count2<10;count2++)
Fill(s[count2],count1,count2);
}
seconds = 0;
Cat.d = Mouse.d = North;
}
int Map::meet()

{return (Cat.x==Mouse.x && Cat.y==Mouse.y);}
void Map::Fill(char s,int x,int y)

{
switch(s)
{
case '*': item[x][y]=0;break;
case '.': item[x][y]=1;break;
case 'C': item[x][y]=1;Cat.x=x,Cat.y=y;break;
case 'M': item[x][y]=1;Mouse.x=x,Mouse.y=y;break;
}
}
void Map::move()

{
if(!movable(Cat)) Cat.d=(Direction)((Cat.d+1)%4);
if(!movable(Mouse)) Mouse.d=(Direction)((Mouse.d+1)%4);
seconds++;
}
int Map::movable(Point& pos)

{
switch(pos.d)
{
case North:
if(0!=pos.x && item[pos.x-1][pos.y])
{pos.x--;return 1;}
break;
case East:
if(9!=pos.y && item[pos.x][pos.y+1])
{pos.y++;return 1;}
break;
case South:
if(9!=pos.x && item[pos.x+1][pos.y])
{pos.x++;return 1;}
break;
case West:
if(0!=pos.y && item[pos.x][pos.y-1])
{pos.y--;return 1;}
break;
}
return 0;
}