感慨
这个题实在是一个大水题(虽然说是世界决赛真题),但是它给出的输入输出数据,标示着老子世界决赛真题虽然题目很水但是数据就能卡死你。。。一直pe pe直到今天上午AC。。。无比感慨。。。就是因为最后一行不能空行。
题目大意
这个题目说的是有这么一个55的正方形里面有24个小正方形和一个空,然后这个游戏本来的意思是要通过移动把所有的正方形(每一个都印着一个字母)按照字母表的顺序排列好,但是这个题它放水了,没有让你去找怎么移动,而是仅仅给你一些指令去看看这些指令过后这个55的版是什么样子。。。emmm这不就很简单了,如果你这么想那就错了首先它的输入数据就会卡人。
分析卡人的地方
①输入数据是一连串连续的字符,而中间的空不用@,不用#,就用空格。空格啊,我去让我第一次输入的时候就没发现而被坑到了。空格意味着什么?意味着scaanf和cin的扑街。
②然后它输入的指令是无限多的然后到0结束,嗯这个还比较容易但是居然指令中间还会有空行啊我去。。。可能指令就有多行,空行意味着什么?意味着getline也扑街了。
③好在我们还有c=getchar()的while循环,但是输出数据还有第一个常规坑就是字母最后不能有多余的空格,这个很好理解啊,一般的题也可能有。
④到了最后就是最坑的了,就是输出的最后一行不能有空行。关键输出结束看的是Z啊,我怎么知道什么时候输出Z?
解决最后输出Z的时候上一个结果不能有多余空行的问题
我直到今天上午才想明白这个东西,只要在Z的后面加一个if(num>0) 然后回车就行了,然后把下面的每个结果再空行的都删掉就ok了。
题目解法
实在没什么好说的这个题自己写一个swap然后按照意思swap就行了,注意要加一个判定如果出界那么就是无结果。我这个判定写在了一个函数里面
我的代码(vj 20ms)
#include <iostream>
#include <cstring>
using namespace std;
int f;
char order[10000];
char orderplus[10000];
string map[5];
void swap(char &a,char &b)
{
char c;
c=a;
a=b;
b=c;
}
bool exc(int a,int b)
{
if(a<0||b<0||a>=5||b>=5)
{
f=1;
return true;
}
else
return false;
}
main()
{
int num=0;
while(1)
{
memset(order,0,sizeof(order));
f=0;
int x,y;
for(int i=0;i<5;i++)
{
getline(cin,map[i]);
if(map[0][0]==‘Z‘)
return 0;
}
if(num>0)
cout<<endl;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(map[i][j]==‘ ‘)
{
x=i;y=j;
}
int p=0;
char now;
while((now=getchar())!=‘0‘)
order[p++]=now;
cin.get();
for(int i=0;i<p;i++)
{
if(order[i]==‘A‘)
{
if(exc(x-1,y))
break;
swap(map[x-1][y],map[x][y]);
x=x-1;y=y;
}
else if(order[i]==‘R‘)
{
if(exc(x,y+1))
break;
swap(map[x][y+1],map[x][y]);
x=x;y=y+1;
}
else if(order[i]==‘B‘)
{
if(exc(x+1,y))
break;
swap(map[x+1][y],map[x][y]);
x=x+1;y=y;
}
else if(order[i]==‘L‘)
{
if(exc(x,y-1))
break;
swap(map[x][y-1],map[x][y]);
x=x;y=y-1;
}
}
printf("Puzzle #%d:\n",++num);
if(f)
cout<<"This puzzle has no final configuration.\n";
else
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cout<<map[i][j];
if(j<4)
cout<<" ";
}
cout<<endl;
}
}
}
}
原文地址:https://www.cnblogs.com/baccano-acmer/p/9742031.html
时间: 2024-10-03 23:39:09