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

 KEY:我为了解题方便,在原图的四周,加上了‘ * ’这样就不怕出界了;

 

Source:

#include
< iostream >
using   namespace  std;

int  d1[ 4 ] = {-1,0,1,0} ;
int  d2[ 4 ] = {0,1,0,-1} ;

char  a[ 15 ][ 15 ];
struct  node
{
    
int x;
    
int y;
}
;

node C,M;

void  init()
{
    
int i,j;
    
for(i=0;i<=11;i++)
        
for(j=0;j<=11;j++)
            a[i][j]
='*';
}


void  input()
{
    
int i,j;
    
char c;
    
for(i=1;i<=10;i++)
        
for(j=1;j<=10;j++)
        
{
            cin
>>c;
            
if(c=='M'
            
{
                M.x
=i;
                M.y
=j;
            }

            
if(c=='C')
            
{
                C.x
=i;
                C.y
=j;
            }

            a[i][j]
=c;
        }

}


int  count()
{
    
int T=0;
    
int c=0,m=0;
    
while!(M.x==C.x&&M.y==C.y)&&T<=1000)
    
{
        
if(a[M.x+d1[m]][M.y+d2[m]]!='*')
        
{
            M.x
+=d1[m];
            M.y
+=d2[m];
        }

        
else 
        
{
            m
++;
            m
=m%4;
        }


        
if(a[C.x+d1[c]][C.y+d2[c]]!='*')
        
{
            C.x
+=d1[c];
            C.y
+=d2[c];
        }

        
else 
        
{
            c
++;
            c
=c%4;
        }

        T
++;
    }

    
if(T==0||T>1000return -1;
    
else return T;
}


int  main()
{
//    freopen("fjnu_1409.in","r",stdin);
    int N;
    cin
>>N;
    
for(int i=1;i<=N;i++)
    
{
        init();
        input();
        cout
<<count()<<endl;
    }

    
return 0;
}











 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值