| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
200AC留念 附加代码#include"stdio.h"
#include"iostream"
struct snake
{
int body[300][2] , dir , h , t , l , active ;
}S[26] ;
int d[4][2]={ {-1,0} , { 0 , 1 } , { 1 , 0 } , { 0 , -1 } } ;
int N , T ;
char box[1010][1010] , visited[1010][1010] ;
void input()
{
int i ;
scanf("%d%d",&N,&T);
for( i=1 ; i<=N ; i++ )
scanf("%s",&box[i][1] ) ;
for( i=0 ; i<=N+1 ; i++ )
{
box[0][i]='#' ; box[N+1][i]='#';
box[i][0]='#' ; box[i][N+1]='#';
box[i][N+2]='\0' ;
}
memset( visited , 0 , sizeof( visited ) ) ;
for( i=0 ; i<26 ; i++ ) S[i].active=0 ;
}
void get_s( int si , int sj , int k )
{
visited[si][sj]=k + 'a' ;
if( visited[si-1][sj]!=k+'a' && box[si-1][sj]-'a' == k )
{
S[ k ].body[ S[k].t+1 ][0]=si-1 ;
S[ k ].body[ S[k].t+1 ][1]=sj ;
S[k].t++;
get_s( si-1 , sj , k ) ; return ;
}
if( visited[si+1][sj]!=k+'a' && box[si+1][sj]-'a' == k )
{
S[ k ].body[ S[k].t+1 ][0]=si+1 ;
S[ k ].body[ S[k].t+1 ][1]=sj ;
S[k].t++;
get_s( si+1 , sj , k ) ; return ;
}
if( visited[si][sj-1]!=k+'a' && box[si][sj-1]-'a' == k )
{
S[ k ].body[ S[k].t+1 ][0]=si ;
S[ k ].body[ S[k].t+1 ][1]=sj-1 ;
S[k].t++;
get_s( si , sj-1, k ) ; return ;
}
if( visited[si][sj+1]!=k+'a' && box[si][sj+1]-'a' == k )
{
S[ k ].body[ S[k].t+1 ][0]=si ;
S[ k ].body[ S[k].t+1 ][1]=sj+1 ;
S[k].t++;
get_s( si , sj+1 , k ) ; return ;
}
}
void get_d( int k )
{
if( S[k].body[0][0]==S[k].body[1][0]-1 ) S[k].dir=0;
else if( S[k].body[0][1]==S[k].body[1][1]+1 ) S[k].dir=1;
else if( S[k].body[0][0]==S[k].body[1][0]+1 ) S[k].dir=2;
else S[k].dir=3 ;
}
void scan()
{
int i , j ;
for( i=1 ; i<=N ; i++ )
for( j=1 ; j<=N ; j++ )
{
if( box[i][j]>='A' && box[i][j]<='Z' )
{
S[ box[i][j]-'A' ].active=1;
S[ box[i][j]-'A' ].h=S[ box[i][j]-'A' ].t=0 ;
S[ box[i][j]-'A' ].body[0][0]=i;
S[ box[i][j]-'A' ].body[0][1]=j;
get_s( i , j , box[i][j]-'A' ) ;
S[ box[i][j]-'A'].l = S[ box[i][j]-'A'].t ;
get_d( box[i][j]-'A' ) ;
}
}
}
bool go( int k , int n)
{
int f=(S[k].dir+n)%4 , nx , ny ;
if( box[ S[k].body[ S[k].h ][0]+ d[f][0] ][ S[k].body[ S[k].h][1] + d[f][1] ]=='.' )
{
S[k].dir=f ;
nx=S[k].body[ S[k].h ][0]+ d[f][0] ; ny=S[k].body[ S[k].h][1] + d[f][1] ;
box[ S[k].body[ S[k].h ][0]+ d[f][0] ][ S[k].body[ S[k].h][1] + d[f][1] ]='A' + k ;
box[ S[k].body[ S[k].h ][0] ][ S[k].body[ S[k].h][1] ]='a' + k ;
box[ S[k].body[ S[k].t ][0] ][ S[k].body[ S[k].t][1] ]='.' ;
S[k].h--;
if( S[k].h<0 ) S[k].h=S[k].l ;
S[k].body[ S[k].h ][0] = nx ;
S[k].body[ S[k].h ][1] = ny ;
S[k].t--;
if( S[k].t<0 ) S[k].t=S[k].l ;
return true ;
}
return false ;
}
bool moves( int k )
{
if( go( k , 0 ) ) return true;
if( go( k , 5 ) ) return true ;
if( go( k , 3 ) ) return true ;
return false ;
}
void output()
{
int i , j ;
for( i=1 ; i<=N ; i++ )
{
for( j=1 ; j<=N ; j++ )
printf("%c",box[i][j] ) ;
printf("\n") ;
}
}
bool move()
{
int i;
bool r = false ;
for( i=0 ; i<26 ; i++ )
{
if( S[i].active && moves( i ) ) r=true;
}
return r ;
}
void run()
{
int i ;
for( i=0 ; i<T ; i++ )
{
if( !move() ) return ;
}
}
int main()
{
input();
scan();
run();
output();
return 0 ;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator