#include<stdio.h>
#include<string.h>
int action(char A[][5],int j,int *key1,int *key2)
{ //通过移动下标来代替元素位置的改变。
// A:0
// B:1
// L:2
// R:3
if(j==0){
A[*key1][*key2] = A[*key1-1][*key2];
if(*key1>0)
*key1 = *key1 - 1;
else return 0;
}
if(j==1){
A[*key1][*key2] = A[*key1+1][*key2];
if(*key1<4)
*key1 = *key1 + 1;
else return 0;
}
if(j==2){
A[*key1][*key2] = A[*key1][*key2-1];
if(*key2>0)
*key2 = *key2 - 1;
else return 0;
}
if(j==3){
A[*key1][*key2] = A[*key1][*key2+1];
if(*key2<4)
*key2 = *key2 + 1;
else return 0;
}
return 1;
}
int main()
{
bool line = false;
int cnt=0;
const char act[] = {'A','B','L','R'};
while(1){
char A[5][5] = {0};
char moves[1000] = {0};
for(int i=0;i<5;i++){ //输入方阵
gets(A[i]);
if(i==0)
if(A[i][0] == 'Z')
return 0;
}
int flag = 1; //判断结果是否有效
cnt++;
int k = 0;
for(int i=0;;i++){ //输入所要做的步骤
scanf("%c",&moves[i]);
if(moves[i] == '\n') moves[i] = ' ';
if(moves[i] == '0'){ //最后留了一个 \n ,使得下一次循环的A[0]被直接跳过!
moves[i] = '\0';
break;
}
}
for(int i=0;i<strlen(moves);i++){
if(moves[i] != 'A' && moves[i] !='B' && moves[i] !='L' && moves[i] !='R' && moves[i] != ' '){
flag = 0;
goto out;
}
}
int key1;
int key2;
for(int i=0;i<5;i++) //find space
for(int j=0;j<5;j++)
if(A[i][j] == ' '){
key1 = i;
key2 = j;
}
for(int i=0;i<strlen(moves);i++){ //开始移动
for(int j=0;j<4;j++)
if(moves[i] == act[j])
if( !action(A,j,&key1,&key2) ){
flag = 0;
goto out;
}
}
out: //output
if(line) printf("\n"); //输出格式
line = true;
printf("Puzzle #%d:\n",cnt);
if(flag){
A[key1][key2] = ' ';
for(int i=0;i<5;i++){
printf("%c",A[i][0]);
for(int j=1;j<5;j++){
printf(" %c",A[i][j]);
}
printf("\n");
}
}
else printf("This puzzle has no final configuration.\n");
getchar(); //吃掉剩下的 \n
}
return 0;
}
小小的纪念一下。
主要卡在 输入, 输出的格式。