UVA - 227 Puzzle

题目大意:一个 5X5 棋盘,上面有一个空格,输入指定的指令,空格会做相应的移动。输出棋盘最终的状态。

解题思路:先把棋盘读了,指令一个字母一个字母得读。越界和读到 0 就 break,之后判断。

注意点

  1. 输入的时候比如 “AWEF ”空格在最后,可能直接输的是“AWEF”,没错空格没输,所以每个 PUZZLE结束要把棋盘归空。(心酸啊QAQ)
  2. 指令的换行符会保留在缓冲区,要getchar()。
  3. 指令已越界,但之后的内容还未结束。要专门写一步把之后的无效指令读完,不然全都跑到下一次输入了(流泪)
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值