谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)
程序员文章站
2024-03-19 19:27:10
...
问题描述:
有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指 令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指 令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示
解决方案:
#include<stdio.h>
#include<string.h>
int main(){
char p[5][5]={'T','R','G','S','J',
'X','D','O','K','I',
'M',' ','V','L','N',
'W','P','A','B','E',
'U','Q','H','C','F'};
char command[10];
gets(command);
char temp;int x=2,y=1,flag=1;
int l=strlen(command);
printf("%d\n",l);
for(int i=0;i<l;i++){
switch(command[i]){ //根据方向分别改变想x,y的值
case 'A':
x=x-1;
temp=p[x+1][y];
p[x+1][y]=p[x][y];
p[x][y]=temp;
break;
case 'B':
x=x+1;
temp=p[x-1][y];
p[x-1][y]=p[x][y];
p[x][y]=temp;
break;
case 'L':
y=y-1;
temp=p[x][y+1];
p[x][y+1]=p[x][y];
p[x][y]=temp;
break;
case 'R':
y=y+1;
temp=p[x][y-1];
p[x][y-1]=p[x][y];
p[x][y]=temp;
break;
case '0':
break;
default:
printf("This puzzle has no final configuration.");
flag=0;
break;
}
if(command[i]=='0'||flag==0)
break;
}
if(flag=1){ //存在非法指令不再输出结果,flag的作用即此
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
printf("%c",p[i][j]);
}
printf("\n");
}
}
return 0;
}
上一篇: 谈谈自动化测试框架之PO设计模式
下一篇: 无重复字符的最长子串