#2
rjsp2023-09-11 10:45
随手瞎写的,没有验证过,仅供参考
程序代码: #include <cstdio> #include <utility> class worm { public: worm() noexcept : ptail_(&grid_[25][11]), phead_(&grid_[25][30]) { for( size_t y=0; y!=52; ++y ) { for( size_t x=0; x!=52; ++x ) { if( y==0 || y==51 || x==0 || x==51 ) grid_[y][x] = '~'; else if( y==25 && (x>=11 && x<30) ) grid_[y][x] = +1; else grid_[y][x] = 0; } } } enum RESULT{ SUCCESSFULLY, RAN_OFF_THE_BOARD, RAN_INTO_ITSELF }; RESULT move( char cmd ) noexcept { signed char* ptemp = ptail_; ptail_ += *ptail_; *ptemp = 0; switch( cmd ) { case 'E': *phead_= +1; break; case 'W': *phead_= -1; break; case 'S': *phead_=+52; break; case 'N': *phead_=-52; break; } phead_ += *phead_; if( *phead_ == '~' ) return RAN_OFF_THE_BOARD; if( *phead_ != 0 ) return RAN_INTO_ITSELF; return SUCCESSFULLY; } std::pair<RESULT,size_t> move( const char* cmds ) noexcept { size_t index; for( index=0; cmds[index]; ++index ) { RESULT result = move( cmds[index] ); if( result != SUCCESSFULLY ) return {result,index+1}; } return {SUCCESSFULLY,index}; } protected: worm( const worm& ) = delete; worm& operator=( const worm& ) = delete; private: signed char grid_[52][52]; signed char* ptail_; signed char* phead_; }; int main( void ) { for( unsigned n; scanf("%u",&n)==1 && n!=0; ) { char cmds[101]; scanf( "%s", cmds ); auto [result,m] = worm().move( cmds ); switch( result ) { case worm::SUCCESSFULLY: printf("The worm successfully made all %zu moves.\n", m ); break; case worm::RAN_OFF_THE_BOARD: printf("The worm ran off the board on move %zu.\n", m ); break; case worm::RAN_INTO_ITSELF: printf("The worm ran into itself on move %zu.\n", m ); break; } } } |
N. 蠕虫游戏
内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
题目描述
蠕虫是一个古老的电脑游戏,它有许多版本。但所有版本都有一个共同的规则:操纵一条蠕虫在屏幕上转圈,并试着去避免撞到自己或障碍物。
这里我们将模拟一个简单的版本。游戏将在50×50的棋盘上进行,棋盘的左上角为(1,1),蠕虫在初始时是一串20个相连的方格。所谓相连是指方格在水平或垂直方向上相接。蠕虫开始时是水平地伸展开的,从(25,11)到(25,30)。其中(25,30)是它的头。蠕虫只能向东(E)、西(W)、南(s)、北(N)四个方向移动,但不能向自己移动,因此在开始时向西(W)是不允许的。每次移动时,蠕虫向给定的方向移动,一次只移一格,并且保持它的长度不变。因此只有蠕虫的头和尾所占据的方格在移动一步后被改变。注意:蠕虫的头能移动到虫尾刚刚让出的空格。
你将被给定一系列移动指令并模拟虫的移动,直到:蠕虫撞上了自己;蠕虫越出了棋盘;蠕虫成功地完成了这些指令。在前两种情况下你应当忽略剩下的指令。
输入格式
每个输入文件包含了多组数据。每个数据占2行,第1行是一个整数n(n<100),表示移动指令的指令数(以n=0表示输入结束);第2行包括了n个字符(E、W、S、N),字符之间没有空格,表示移动的指令。
输出格式
每个数据输出一行,格式为以下3种中的一种:
The worm ran into itself on move m.
The worm ran off the board on move m.
The worm successfully made all m moves.
注:m是你要决定输出的步数。
样例
输入1
18
NWWWWWWWWWWSESSSWS
20
SSSWWNENNNNNWWWWSSSS
30
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
13
SWWWWWWWWWNEE
0
输出1
The worm successfully made all 18 moves.
The worm ran into itself on move 9.
The worm ran off the board on move 21.
The worm successfully made all 13 moves.
各位大佬,求助!