习题 3_5 uva 227 谜题

学会处理字符,是写这题的关键,字符确实不好玩,因为各种各样记不住呜呜呜
为了读入一整行 先学了 scanf("%[^\n]",&a[0]) 注意人家是不吃换行符的! 所以必须用一个
getchar() 帮他吃掉 然后读这个表就莫得问题了
就是来是巨坑无比的读命令…人家居然会换行?!!!没事!整个特判解决一切 !
getchar 拯救世界!
然后接下来就先把空格确定了然后一步步模拟模拟完边界处理一下就行了

#include <bits/stdc++.h>
using namespace std;
char a[6][6]={'\0'};
int main()
{
	int count = 0;
	while(scanf("%[^\n]",&a[0]))  //char 版 读入一整行 
	{
		int x = 0,y = 0,ok = 1,c,m = 0;
		char as[100]={'\0'};
		if(strlen(a[0])==1||a[0][0]=='Z')break; // 判断结束 
			getchar();							//getchar()不能少! 
		for (int i = 1; i < 5;i++)  //如果莫得结束,再读四行 
		{
			scanf("%[^\n]",&a[i]);     
			getchar();
		}
		while(c = getchar())   //getchar()读指令拯救世界! 
		{
			if(c=='0') break;
			if(c=='\n')continue;
			as[m++] = c;
		}
	//	puts(a[0]);
	//	puts(a[1]);puts(a[2]);puts(a[3]);puts(a[4]);
		for (int i = 0; i < 5; i++)  //我们一起找空格 
		{
		  for (int j = 0; j < 5;j++)
		  {
		  	if(a[i][j]==' ') 
		    {
		  	 x = i; y = j;
		    }
		  }
	    }
	    // 模拟步伐 
		for (int i = 0; i < m; i++)
		{   
		    if(ok)              //如果此时没问题 
			{
			  int dx = 0,dy = 0;
			  if(as[i]=='A')      dx--;
			  else if(as[i]=='B') dx++;
			  else if(as[i]=='L') dy--;
			  else if(as[i]=='R') dy++;
			  if( x+dx<0 || x+dx>4 || y+dy<0 || y+dy>4)  // 边界判定 
			  {
			  	 ok = 0;
			  } 
			  else
			  {
				 a[x][y] = a[x+dx][y+dy];
				 x+=dx;y+=dy;
				 a[x][y] = ' ';
			  }
			}					
		} 
		// 输出结果 
		if(count) printf("\n");
		printf("Puzzle #%d:\n",++count);
		if(!ok)
		{
			printf("This puzzle has no final configuration.\n");
		}
		else
		{
			for (int i = 0; i < 5; i++)
			{
				for (int j = 0; j < 5; j++)
				{
					if(!j) printf("%c",a[i][j]);
					else printf(" %c",a[i][j]);
				}
				printf("\n");
			}
		}
		getchar();  //输出的换行也得吃 
		memset(a,'\0',sizeof(a));
	}	
	return 0;
}

所以还是cin好用,如果时间允许的话,cin可不需要管换行
除了读入一整行,如果前面有一行要先 getchar() ,getline(cin,s)会自动吃掉换行符

发布了55 篇原创文章 · 获赞 1 · 访问量 2646

猜你喜欢

转载自blog.csdn.net/qq_37548017/article/details/100554283