UVA

/*
  这题debug了好久,一直都没有找到错误,后来发现,是因为样例数据的格式有些神奇...比较难调,以及有些别的细节,因为自己观察不细致,也没有发现...导致所有的bug都只能一点点发现
  
  1. 不要选C++5.3.0,应该按照 C++11 5.3.0,好像前者已经废除了gets(),总之如果用前者,编译错
  
  2. 注意观察输入的数据,有一种比较特殊的情况,空格在某行的最后一列,而此空行后,就是字符串结束符,这种情况要单独处理,将结束符换为空格...我当时自己写show()函数检查输出时,就发现了有很多位置不对劲的NULL,现在想来,这就是一个很重要的提示了,毕竟学过,结束符就是NULL...后来加上 if (maps[i][4] == '') 这种情况的处理,格式就没问题了
  
  所以,注意观察输入数据的格式,十分重要,uva许多题目,对格式的处理都需要十分注意,最好先全部复制到一个txt,所有的行尾有没有空格,有没有回车,或者行尾是直接的结束符,都要考虑...关键是,基础知识也要敏感,比如看到NULL要立刻反应过来,是行尾的换行符导致的,而我之前,就不太敏感...
  
  3.注意指令的输入后,要把换行符接受了,否则换行符会作为下一组的maps[0],那样就再也退出不了了...我好像就是这么把vj弄崩了一次...
  
  4.注意指令除了ABLR以外,还有可能出现换行符,有换行符就跳过,此外的字符一定非法,故而default 处一定要直接 return 0; (BTW,鉴于UVA奇葩数据格式的先例,平时其实还需要考虑更多:有没有结束符,有没有空格,对这题而言,这两个如果有,也跳过当作合法数据,不处理,至于遇到0的ASCII码不再接收字符,这个容易想到,但是要做两个处理,一个接受后面的换行符或结束符,一个字符串末加结束符...)
  这两步的处理并不能合写为一步,cmd[k] = getchar(); ,否则WA,因为...说过了getchar()到的不一定是结束符,还可能是换行符

*/



#include <bits/stdc++.h>
using namespace std;  
//#define debug  
char maps[5][10];
int bx, by;
char cmd[1100];

void show()
{	cout << endl << "test:" << endl;
	for (int i = 0; i < 5; i++)
	{
	
		for (int j = 0; j < 5; j++) cout << maps[i][j] << " ";
		cout << endl;
	}
	cout << endl;
}

int is_legal(int op)
{
	int x = bx, y = by;
	switch(op)
	{
		case 'A': x--;break;
		case 'B': x++;break;
		case 'L': y--;break;
		case 'R': y++;break;
		default : return 0;
	}
	if (x < 0 || x > 4 || y < 0 || y > 4) return 0;
	maps[bx][by] = maps[x][y];
	maps[x][y] = ' ';
	bx = x; by = y;
	return 1;
}
  
int main()  
{  	
	#ifdef debug
	freopen("E:\in.txt", "r", stdin);
	freopen("E:\test.txt", "w", stdout);
	#endif
	int kase = 0;
	while (1)
	{
	//	memset(maps, 0, sizeof(maps));
		kase++;
		for (int i = 0; i < 5; i++)
		{
			gets(maps[i]);
			if (maps[0][0] == 'Z') return 0;
			if (maps[i][4] == '') 
			{
				maps[i][4] = ' ';
		//		cout << "yes, test!" << endl;
			}
		}
		for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
		if (maps[i][j] == ' ')
		{
			bx = i; by = j;
		}
	
		int op, flag = 1, k = 0;
		while ((op = getchar()) != '0')
		{
			cmd[k++] = op;
		}
		getchar();
		cmd[k] = '';
		
		for (k = 0; cmd[k]; k++)
		{
			if (cmd[k] == '
') continue;
			flag = is_legal(cmd[k]);
			if (!flag) break;
		}
		
		if (kase != 1)
		cout << endl;
		
		cout << "Puzzle #" << kase << ":" << endl;
		if (!flag) cout << "This puzzle has no final configuration." << endl;
		else
		{
			for (int i = 0; i < 5; i++)
			{
				for (int j = 0; j < 5; j++)
				{
					if (j) cout << " ";
					cout << maps[i][j];
				}
				cout << endl;
			}
		}
   }
	#ifdef debug
	fclose(stdin);
	fclose(stdout);
	#endif
    return 0;  
}  


原文地址:https://www.cnblogs.com/mofushaohua/p/7789529.html