直接模拟做。棋盘共有(10*10*4)^2=160000种状态,循环160000次以后还没相遇就认为无解了。
代码方面么……自己喜欢设计点class,估计看上去好理解一些哈~~
代码方面么……自己喜欢设计点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;
}
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;
}