猫和老鼠

FJNU.1409

Description
猫和老鼠在10*10的方格中运动,例如:
*...*.....
......*...
...*...*..
..........
...*.C....
*.....*...
...*......
..M......*
...*.*....
.*.*......
C=猫(CAT)
M=老鼠(MOUSE)
*=障碍物
.=空地
猫和老鼠每秒中走一格,如果在某一秒末他们在同一格中,我们称他们“相遇”。
注意,“对穿”是不算相遇的。猫和老鼠的移动方式相同:平时沿直线走,下一步如果会走到障碍物上去或者出界,就用1秒的时间做一个右转90度。一开始他们都面向北方。
编程计算多少秒以后他们相遇。

Input
第一行为一整数N,表示有N组测试数据。
每组测试数据为10行,格式如题目描述。

Output
相遇时间T。如果无解,输出-1。

Sample Input
1
*...*.....
......*...
...*...*..
..........
...*.C....
*.....*...
...*......
..M......*
...*.*....
.*.*......

Sample Output
49

Source
oibh

My Program

#include < iostream >
#define  N 10
using   namespace  std;

int  main()
{
    
int i,j,k,n;
    
char map[N][N];
    
int cat_x,cat_y,cat_face;
    
int mouse_x,mouse_y,mouse_face;
    
int T;
    cin
>>n;
    
for(i=0;i<n;i++)
    
{
        T
=0;
        cat_face
=mouse_face=1;
        
for(j=0;j<N;j++)
            
for(k=0;k<N;k++)
            
{
                cin
>>map[j][k];
                
if(map[j][k]=='C')
                
{
                    cat_x
=k;
                    cat_y
=j;
                    
continue;
                }

                
if(map[j][k]=='M')
                
{
                    mouse_x
=k;
                    mouse_y
=j;
                    
continue;
                }

            }

        
while(true)
        
{
            
if(mouse_x==cat_x&&mouse_y==cat_y)
                
break;
            T
++;
            
switch(cat_face)
            
{
            
case 1:            //    face to North    (up)
                if(cat_y!=0&&map[cat_y-1][cat_x]!='*')
                    cat_y
--;
                
else
                    cat_face
=2;        //    turn right    (West)
                break;
            
case 2:            //    face to West    (right)
                if(cat_x!=N-1&&map[cat_y][cat_x+1]!='*')
                    cat_x
++;
                
else
                    cat_face
=3;        //    turn right    (South)
                break;
            
case 3:            //    face to South    (down)
                if(cat_y!=N-1&&map[cat_y+1][cat_x]!='*')
                    cat_y
++;
                
else
                    cat_face
=4;        //    turn right    (East)
                break;
            
case 4:            //    face to East    (left)
                if(cat_x!=0&&map[cat_y][cat_x-1]!='*')
                    cat_x
--;
                
else
                    cat_face
=1;        //    turn right    (North)
                break;
            }

            
switch(mouse_face)
            
{
            
case 1:            //    face to North    (up)
                if(mouse_y!=0&&map[mouse_y-1][mouse_x]!='*')
                    mouse_y
--;
                
else
                    mouse_face
=2;        //    turn right    (West)
                break;
            
case 2:            //    face to West    (right)
                if(mouse_x!=N-1&&map[mouse_y][mouse_x+1]!='*')
                    mouse_x
++;
                
else
                    mouse_face
=3;        //    turn right    (South)
                break;
            
case 3:            //    face to South    (down)
                if(mouse_y!=N-1&&map[mouse_y+1][mouse_x]!='*')
                    mouse_y
++;
                
else
                    mouse_face
=4;        //    turn right    (East)
                break;
            
case 4:            //    face to East    (left)
                if(mouse_x!=0&&map[mouse_y][mouse_x-1]!='*')
                    mouse_x
--;
                
else
                    mouse_face
=1;        //    turn right    (North)
                break;
            }

            
if(T>1000)
                
break;
        }

        
if(T==0||T>1000)
            cout
<<-1<<endl;
        
else
            cout
<<T<<endl;
    }

    
return 0;
}

YOYO's Note:
当T>1000时可以判断无解。之前因为忘记了结果TLE = = 
模拟一遍就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值