sicily 1513. Decoding

//要注意输出格式,先前是形成每个字母或空格都立即输出, PE 多次后发现除了最后一个是空格外,(不完全的组合或超出字母表示范围)
//有可能最后第二个也是空格, "You should throw away any trailing spaces" 说明最后第二个也不能输出空格
//所以要用一数组out记录编码,然后去除掉最后边的空格(无论有多少个)

#include
<iostream>
#include
<cstring>
using namespace std;
int vis[30][30],table[30][30];
char out[100];
int move[10],id,rear;
void add() //move记录访问过的结点值,如果达到5个的话,则可以组成一字母或空格
{
id
=0;
int s=0,fac=16;
for(int k=0;k<5;++k)
{
s
+=move[k]*fac;
fac
/=2;
}
if(s>0&&s<=26)
out[rear++]=char(s+64);
else
out[rear++]=' ';
}
int main()
{
int n,r,c,i,j;
char ch[1000];
cin
>>n;
for(int index=1;index<=n;++index)
{
cin
>>r>>c>>ch;
for(i=1;i<=r;++i)
for(j=1;j<=c;++j)
table[i][j]
=ch[(i-1)*c+j-1]-'0';
memset(vis,
0,sizeof(vis));
vis[
1][1]=1;

move[
0]=table[1][1];rear=0;id=1;
int left=r*c-1,rx=1,cy=1; //(rx,cy)表示当前点的位置,left表示尚有多少点未访问

while(1) //依次按向右,向下,向左,向上的顺时针方向
{
for(j=cy+1;j<=c&&vis[rx][j]!=1;++j) //向右
{
left
--;
move[id
++]=table[rx][j];
vis[rx][j]
=1;
if(id==5)
add();
}
cy
=j-1;
if(left==0) break;


for(i=rx+1;i<=r&&vis[i][cy]!=1;++i) //向下
{
left
--;
move[id
++]=table[i][cy];
vis[i][cy]
=1;
if(id==5)
add();
}
rx
=i-1;
if(left==0) break;


for(j=cy-1;j>=1&&vis[rx][j]!=1;--j) //向左
{
left
--;
move[id
++]=table[rx][j];
vis[rx][j]
=1;
if(id==5)
add();
}
cy
=j+1;
if(left==0) break;


for(i=rx-1;i>=1&&vis[i][cy]!=1;--i) //向上
{
left
--;
move[id
++]=table[i][cy];
vis[i][cy]
=1;
if(id==5)
add();
}
rx
=i+1;
if(left==0) break;

}
while(rear>0&&out[rear-1]==' ') //throw away any trailing spaces and/or partial characters
rear--;
cout
<<index<<" ";
for(i=0;i<rear;++i)
cout
<<out[i];
cout
<<endl;
}
return 0;
}

posted on 2011-07-05 01:55  sysu_mjc  阅读(168)  评论(0编辑  收藏  举报

导航