GitBook

这里写图片描述

第一印象就是题目好长啊…… 据说是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