题目大意:一个 5X5 棋盘,上面有一个空格,输入指定的指令,空格会做相应的移动。输出棋盘最终的状态。
解题思路:先把棋盘读了,指令一个字母一个字母得读。越界和读到 0 就 break,之后判断。
注意点:
- 输入的时候比如 “AWEF ”空格在最后,可能直接输的是“AWEF”,没错空格没输,所以每个 PUZZLE结束要把棋盘归空。(心酸啊QAQ)
- 指令的换行符会保留在缓冲区,要getchar()。
- 指令已越界,但之后的内容还未结束。要专门写一步把之后的无效指令读完,不然全都跑到下一次输入了(流泪)
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main () {
char puzzle[5][5], move;
int i , j , n = 0 , m;
while( gets(puzzle[0]) ){
if( !(strcmp(puzzle[0],"Z"))) break;
for( i = 1; i < 5 ; i++) {
gets(puzzle[i]);
}
m = 0;
for( i=0; i<5 ;i++){
for( j=0; j<5 ; j++){
if( puzzle[i][j] == ' ') {m=1; break;}
}
if(m) break;
}
n++;if(n != 1) cout << endl;
while( scanf("%c",&move )) {
if( move == '0') break;
switch(move){
case 'A': puzzle[i][j] = puzzle[i-1][j];
puzzle[i-1][j] = ' ';
i--;break;
case 'B': puzzle[i][j] = puzzle[i+1][j];
puzzle[i+1][j] = ' ';
i++;break;
case 'L': puzzle[i][j] = puzzle[i][j-1];
puzzle[i][j-1] = ' ';
j--;break;
case 'R': puzzle[i][j] = puzzle[i][j+1];
puzzle[i][j+1] = ' ';
j++;break;
}
if( i < 0 || i >4 || j< 0 || j >4) {
while(move != '0') scanf("%c",&move);
cout << "Puzzle #"<<n<<':'<<endl<<"This puzzle has no final configuration."<<endl;
m = 0;
break;
}
}
if(m){
cout << "Puzzle #"<<n<<':'<<endl;
for( i = 0 ; i < 5 ; i++ ) {
for( j = 0 ; j < 5 ; j++){
cout << puzzle[i][j];
if( j != 4) cout <<" ";
}
cout << endl;
}
}
memset( puzzle , ' ' , sizeof(puzzle));
getchar();
}
return 0;
}