Fancy Mouse
- -|||
直接模拟做。棋盘共有(10*10*4)^2=160000种状态,循环160000次以后还没相遇就认为无解了。
代码方面么……自己喜欢设计点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;
}
posted on 2005-09-24 12:19  Fancy Mouse  阅读(283)  评论(1编辑  收藏  举报