Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define sf scanf
- #define pf printf
- #define inf INT_MAX
- #define dbg cout << "Debug" << endl;
- #define MAX 1024
- #define block -1
- #define white +0
- #define noway -3
- #define source -4
- #define goal -5
- using namespace std;
- void clr();
- void printGrid();
- void printGrid2();
- void printGrid3();
- vector < int > adjList[1024];
- char ans[28][28];
- int dx[] = { +0, -1, +0, +1 };
- int dy[] = { -1, +0, +1, +0 };
- int nodes,start,edges,n,a,b,c=0,l,w,sx,sy,gx,gy,flag = false,off = false;
- int visited[1025] ,d[1024],par[1024];
- int cost[1024][1024];
- int grid[ MAX ][ MAX ];
- bool isOk( int x, int y ){
- return ( x >= 1 && (x <= (l << 2)+1) && y >= 1 && (y<=(w<<1)+1) );
- }
- bool isValid( int cd, int pd ){
- if( (cd == 2 && pd == 0) || ( pd == 2 && cd == 0 ) || ( cd == 3 && pd == 1) ||
- (cd == 1 && pd == 3) ) return false;
- else return true;
- }
- bool isNoMove( int x, int y , int pd ){
- for( int i=0; i<4; i++ ){
- int mx = dx[i] + x;
- int my = dy[i] + y;
- if( grid[mx][my] == white && isOk(mx,my) && isValid(i,pd) ) return false;
- }
- return true;
- }
- void solve( int x, int y, int pd , int c ){ // was a fuck
- if (grid[x][y] == goal ){
- grid[x][y]=c;
- flag = 1;
- return;
- }
- if (isNoMove(x,y,pd) ){
- grid[x][y]=noway;
- return;
- }
- for ( int i = 0; i < 4; i++ ){
- int mdx = dx[i] + x;
- int mdy = dy[i] + y;
- int fx = (dx[i] << 1) + x;
- int fy = (dy[i] << 1) + y;
- if( isValid(i,pd) && isOk(fx,fy) && grid[mdx][mdy] == white && !flag){
- solve( fx,fy, i, c+1 );
- if (!flag)grid[x][y] = noway;
- if(flag) grid[x][y] = c;
- }
- }
- }
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("in.txt","rt",stdin);
- freopen("out.txt","wt",stdout);
- #endif
- int tc= 0;
- while ( sf("%d %d %d %d %d %d", &l, &w, &sx, &sy, &gx, &gy) , l+w+sx+sy+gx+gy ){
- for( int i=1; i<=l; i++ ){
- for( int j=1; j<=w; j++ ){
- sf("%d",&a);
- if( a == 1 ) grid[(i << 1)][( j<<1 ) + 1] = block;
- else if( a == 2 ) grid[(i << 1)+1][( j<<1 )] = block;
- else if( a == 3 ) { grid[(i << 1)][( j<<1 ) + 1] = block; grid[(i << 1)+1][( j<<1 )] = block; }
- }
- }
- grid[sx<<1][sy<<1] = source; grid[gx<<1][gy<<1] = goal;
- for( int i=1; i<=((w<<1)+1); i++ ) { grid[1][i] = block; grid[(l<<1)+1][i] = block; }
- for( int i=1; i<=((l<<1)+1); i++ ) { grid[i][1] = block; grid[i][(w<<1)+1] = block; }
- int cur = 1,tx,ty;
- sx = sx<<1;
- sy = sy<<1;
- solve(sx,sy,-1,1);
- printGrid();
- printf("Maze %d\n\n", ++tc);
- memset( ans, '\0', sizeof ans );
- printGrid2();
- puts("");
- puts("");
- clr();
- }
- return 0;
- }
- void clr(){
- flag= false, c=0;
- memset( grid, 0, sizeof grid );
- memset( ans, '\0', sizeof ans );
- }
- void printGrid(){
- for( int i=1; i<= ( (l<<1)+1) ; i++ ){
- for( int j=1; j<= ( w<<1)+1; j++ ){
- printf("%2d ", grid[i][j] );
- }
- puts("");
- }
- }
- void printGrid2(){
- for( int i=1; i<=(w<<2)+1 ; i++ ){
- if( i%4 == 1 ) { ans[1][i] = '+'; ans[(l<<1)+1][i] = '+';}
- else { ans[1][i] = '-'; ans[(l<<1)+1][i] = '-';}
- }
- for( int i=1; i<=(l<<1)+1; i+=2 ){
- for(int j=1; j<=(w<<2)+1; j+=4){
- ans[i][j] = '+';
- }
- }
- for( int i=1; i<=(l<<1)+1; i++ ){
- if(i&1){
- ans[i][1] = '+'; ans[i][(w<<2)+1] = '+';
- }
- else{
- ans[i][1] = '|'; ans[i][(w<<2)+1] = '|';
- }
- }
- for( int i=2; i<=(l<<1); i+=2 ){
- for( int j=2; j<=(w<<2); j+=2 ){
- int v = grid[i][j];
- if( v == noway ){
- ans[i][j*2] = '?'; ans[i][(j*2)-1] = '?';
- ans[i][(j*2)-2] = '?';
- }
- else if( v > 0 ) {
- if( v <= 9 ){
- ans[i][j<<1] = v + '0';
- ans[i][(j<<1)-1] = ' ';
- ans[i][(j<<1)-1] = ' ';
- }
- else{
- if( v<=99 ){
- char d1 = v%10+'0'; char d2 = (v/10)+'0';
- ans[i][j<<1] = d1;
- ans[i][(j<<1)-1] = d2;
- ans[i][(j<<1)-1] = ' ';
- }
- else{
- ans[i][j<<1] = v%10+'0';
- ans[i][(j<<1)-1] = ((v/10)%10)+'0';
- ans[i][(j<<1)-1] = ((v/10)/10)+'0';
- }
- }
- }
- if(grid[i][j+1] == block ) ans[i][(j<<1)+1] = '|';
- if(grid[i+1][j] == block){
- ans[i+1][j*2] = '-'; ans[i+1][(j*2)-1] = '-';
- ans[i+1][(j*2)-2] = '-';
- }
- }
- }
- for( int i=1; i<=(l<<1)+1; i++ ){
- for( int j=1; j<=(w<<2)+1; j++ ){
- if( (ans[i][j]>='0' && ans[i][j]<='9')|| ans[i][j] == '+' || ans[i][j] == '?' || ans[i][j] == '-' || ans[i][j] == '|' ){
- pf("%c",ans[i][j]);
- }
- else pf(" ");
- }
- puts("");
- }
- }
Add Comment
Please, Sign In to add comment