【UVa】[227]Puzzle
第一印象就是题目好长啊……
据说是ACM/ICPC World Finals 1993的一道题……
感觉屌屌的~
所以……
先把前几天写的对这一题的思路全部打上为敬……
用二维字符串数组储存网格(第n行整体为一字符串)
用字符串记录指令语句,用循环来进行判断
读取到A、B、L、R执行对应命令
其它字符 break; 并输出“This puzzle has no final configuration.”
输入可用两重循环并使用 x,y 来记录空格所在
(网格中空格处记录为 0)
(第二重循环结束用getchar()吸收空行)
A:上 B:下 L:左 R:右 (A:把上方的字母移入空格)
示例代码:
// ARRBBL 其对应变化为 // A: map(x,y)=map(x,y-1); map(x,y-1)=0; y=y-1; // B: map(x,y)=map(x,y+1); map(x,y+1)=0; y=y+1; // L: map(x,y)=map(x-1,y); map(x-1,y)=0; x=x-1; // R: map(x,y)=map(x+1,y); map(x+1,y)=0; x=x+1;
变换后输出结果 (应该可以用一重循环搭配 printf)
printf("%s\n",map[y]);
/* 需要测试 */最直接的还是用两重循环搭配putchar()
(第二重循环结束输出”\n”)
当时就是这样想的
然后今天来正式的写~
首先做二维数组相关的测试
事实证明
char map[5][5];
for(int i=0; i<5; i++)
scanf("%s",map[i]);
此种写法会把字符存在
map[0][1-5] 这里面
同理可用于 printf
不可以这么打印啊……
具体见:【看书】二维字符数组
所以输入网格的时候不一定要用getchar()
但这里因为涉及到网格中空格的判定
所以还是用 两重循环搭配 getchar() 比较好
久经尝试
虽然改了各种坑点还是WA了……
是在下小看这一题了
先打个flag
WA代码:
#include<stdio.h>
#include<string.h>
int main() {
int x,y;
int k,kase=0;
char s[1000];
char map[5][5];
while(scanf("%c",&map[0][0]),map[0][0]!='Z') {
for(int i=0; i<5; i++) {
int flag=1;
for(int j=0; j<5; j++) {
if(i||j) {
map[i][j]=getchar();
if(map[i][j]==' ') {
y=i;
x=j;
} else if(map[i][j]=='\n') {
map[i][j]=' ';
y=i;
x=j;
flag=0;
}
} else
continue;
}
if(flag)
getchar();
}
int t=-1;
memset(s,0,sizeof(s));
while((s[++t]=getchar())!='0');
if(kase)
printf("\n");
printf("Puzzle #%d:\n",++kase);
for(k=0; k<t; k++) {
if(s[k]=='A') {
if(y-1<0) {
printf("This puzzle has no final configuration.\n");
break;
} else {
map[y][x]=map[y-1][x];
map[y-1][x]=0;
y=y-1;
}
} else if(s[k]=='B') {
if(y+1>=5) {
printf("This puzzle has no final configuration.\n");
break;
} else {
map[y][x]=map[y+1][x];
map[y+1][x]=0;
y=y+1;
}
} else if(s[k]=='L') {
if(x-1<0) {
printf("This puzzle has no final configuration.\n");
break;
} else {
map[y][x]=map[y][x-1];
map[y][x-1]=0;
x=x-1;
}
} else if(s[k]=='R') {
if(x+1>=5) {
printf("This puzzle has no final configuration.\n");
break;
} else {
map[y][x]=map[y][x+1];
map[y][x+1]=0;
x=x+1;
}
} else if(s[k]=='\n') {
continue;
} else {
printf("This puzzle has no final configuration.\n");
break;
}
}
if(k==t) {
for(int i=0; i<5; i++) {
for(int j=0; j<5; j++) {
putchar(map[i][j]);
if(j!=4)
putchar(' ');
}
printf("\n");
}
}
memset(map,0,sizeof(map));
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
}
return 0;
}
题目地址:【UVa】[227]Puzzle