有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”
#include<iostream>#include<string.h>usingnamespace std;char s[5][5]={{'T','R','G','S','J'},{'X','D','O','K','I'},{'M','Z','V','L','N'},{'W','P','A','B','E'},{'U','Q','H','C','F'}};//先将空格标记为Z,后面进行处理intmain(){char a, x;int row, col;while((a =getchar())!='\n'){for(int i =0; i <5; i ++)for(int j =0; j <5; j ++){if(s[i][j]=='Z'){
row = i;
col = j;
i = j =4;}}switch(a){//注意溢出情况case'A': s[row][col]= s[(row -1)>=0?(row -1):4][col];
s[(row -1)>=0?(row -1):4][col]='Z';break;case'B': s[row][col]= s[(row +1)<=4?(row +1):0][col];
s[(row +1)<=4?(row +1):0][col]='Z';break;case'L': s[row][col]= s[row][(col -1)>=0?(col -1):4];
s[row][(col -1)>=0?(col -1):4]='Z';break;case'R': s[row][col]= s[row][(col +1)<=4?(col +1):0];
s[row][(col +1)<=4?(col +1):0]='Z';break;default: cout <<"This puzzle has no final configuration. \n";return0;}}for(int i =0; i <5; i ++){for(int j =0; j <5; j ++){
cout <<(s[i][j]=='Z'?' ':s[i][j]);//cout << s[i][j];}
cout << endl;}return0;}