习题3_5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)

习题3_5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)

题目描述:
有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R, 分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出"This puzzle has no final configuration.",例如,图中执行ARRBBL0后,效果如图所示
习题3_5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)_第1张图片

原题:
习题3_5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)_第2张图片习题3_5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)_第3张图片

对字符串输入和输出的考察,坑挺多的

一直是runtime error,最后发现没有重置默认空格位置,每次都重置就好了

#include
#include 
using namespace std;

char frame[5][5];
char s[20];

int main(){
     
	#ifdef LOCAL
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	#endif
	int count = 0;
	 
	char c;
	
	while(true) {
     
		int x = -1, y = -1;  // 空格现在所在位置
		bool flag = true;
		for(int i = 0; i < 5; i++) {
     
			memset(s, '\0', sizeof(s));
			fgets(s, 10, stdin);  // 读入一行,如果行末有\n 则 fgets 会把\n读入字符串  "...\n\0"
			if(s[0] == 'Z') {
       //退出  有可能是 "Z\n\0" 或 "Z\0"
				return 0;
			}
			for(int j = 0; j < 5; j++) {
     
				c = s[j];
				frame[i][j] = s[j];
				//if(frame[i][j] == 'Z') return 0;  网格中可能含有Z 
				if(frame[i][j] == ' ') {
     
					x = i;
					y = j;	
				}
			}
		}
		
		if(x < 0 || y < 0) {
      // 没有输入空格 
			flag = false;
		}
		
		while( (c = getchar()) != '0') {
     
			switch(c) {
     
				case 'A':{
     
					if(--x >= 0) {
     
						frame[x + 1][y] = frame[x][y];
						frame[x][y] = ' ';
					} else {
     
						flag = false;
					}
					break;
				}
				case 'B':{
     
					if(++x <= 4) {
     
						frame[x - 1][y] = frame[x][y];
						frame[x][y] = ' ';
					} else {
     
						flag = false;
					}
					break;
				}
				case 'L':{
     
					if(--y >= 0) {
     
						frame[x][y + 1] = frame[x][y];
						frame[x][y] = ' ';
					} else {
     
						flag = false;
					}
					break;
				}
				case 'R':{
     
					if(++y <= 4) {
     
						frame[x][y - 1] = frame[x][y];
						frame[x][y] = ' ';
					} else {
     
						flag = false;
					}
					break;
				}
				case '\n':break;
				default : flag = false;
			}
		}
		getchar();
		if(count > 0) {
     
			printf("\n");
		}
		printf("Puzzle #%d:\n", ++count);
		if(flag) {
     
			for(int i = 0; i < 5; i++) {
     
				for(int j = 0; j < 5; j++) {
     
					if(j == 0){
     
						printf("%c", frame[i][j]);
					} else {
     
						printf(" %c", frame[i][j]);
					}
					
					if(j == 4) {
     
						printf("\n");
					}
				}
			}
		} else {
     
			printf("This puzzle has no final configuration.\n");
		}
	}
	
	return 0;
} 

你可能感兴趣的:(算法竞赛,字符串,acm竞赛)