codeforce 606B Testing Robots
题意:给定一个x*y的矩形,和一个机器人的初始位置(x0,y0)。以向下为x轴正方向,向右为y轴正方向。现在要对这个机器人进行多次测试。每次测 试,会在矩形的某个位置有一个矿井。所以一共要进行x*y次测试,每次测试,矿井会出现在一个之前的测试没有出现过的地方,而机器人的初始位置保持不变 (即为(x0,y0))。
每次测试,机器人会沿一个给定的字符串走,字符串只可能包括'L', 'R', 'U', 'D',分别代表向左,向右,向上,向下。当然,如果机器人不能沿所给的方向走(就是走到了边缘),机器人会呆在原地一次。每次测试,机器人都按这个给定的字符串走。当机器人走到和矿井所在的位置重合时,机器人会爆炸,当机器人恰好走完这个字符串之后,机器人也会爆炸。
现在想知道,机器人在走了第k步后(0<=k<=n,其中n为字符串的长度),有多少种测试情况会使机器人在恰好走了k步之后就爆炸了?
思路:模拟一下,区分先前走过与没有走过。
1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<memory.h> 5 #include<string.h> 6 #include<algorithm> 7 #include<cmath> 8 const int N = 30; 9 const int inf=-100000; 10 using namespace std; 11 12 int g[510][510]; 13 int num; 14 int X,Y,X0,Y0,xx,yy; 15 int fun(char c) 16 { 17 int flag=0; 18 switch(c) 19 { 20 case'R': 21 if(yy<Y) 22 yy++; 23 break; 24 case'L': 25 if(yy>1) 26 yy--; 27 break; 28 case'U': 29 if(xx>1) 30 xx--; 31 break; 32 case'D': 33 if(xx<X) 34 xx++; 35 break; 36 } 37 if(g[xx][yy]==0) 38 { 39 flag=1; 40 num--; 41 } 42 g[xx][yy]=1; 43 return flag; 44 } 45 int main() 46 { 47 //int x,y,x0,y0; 48 char str[100010]; 49 scanf("%d%d%d%d",&X,&Y,&X0,&Y0); 50 scanf("%s",str); 51 memset(g,0,sizeof(g)); 52 num=X*Y; 53 num--; 54 xx=X0,yy=Y0; 55 g[X0][Y0]=1; 56 cout<<"1 "; 57 for(int i=0;i<strlen(str)-1;i++) 58 { 59 cout<<fun(str[i])<<" "; 60 } 61 if(fun(str[strlen(str)-1])) 62 { 63 num++; 64 cout<<num<<endl; 65 } 66 else 67 { 68 cout<<num<<endl; 69 } 70 return 0; 71 }