필기문제: 03년미궁.

6005 단어 미궁.
#include <stdio.h>
#include <stdlib.h>
#include <queue>

using namespace std;
//         

//              。        :      。

#define MAXSIZE 128
bool bMark[MAXSIZE][MAXSIZE];    //      ,true:       ,false:       
int iArrMaze[MAXSIZE][MAXSIZE]; //    ,0:   ,1:   
typedef struct Stat             //    
{
	Stat(int iX,int iY,int iStep):_iX(iX),_iY(iY),_iStep(iStep){}
	int _iX;                  //   
	int _iY;                  //   
	int _iStep;               //  
}Stat;
queue<Stat> queueStat;      //          ,               
int iArrGo[][2] = { {0,1} , {0,-1} ,{1,0} ,{-1,0}};//         
int iBegX,iBegY;//       
int iEndX,iEndY;//       
int iM,iN;      //        
bool isSuccess = false;//             

int BFS(int iRow,int iCol)
{
	while(!queueStat.empty())
	{
		Stat curStat = queueStat.front();
		queueStat.pop();
		for(int i = 0 ; i < 4 ; i++)//4   ,         
		{
			int iNx = curStat._iX + iArrGo[i][0];
			int iNy = curStat._iY + iArrGo[i][1];
			
			//          ,             
			if(iNx < 0 || iNx >= iRow || iNy < 0 || iNy >= iCol )
			{
				continue;
			}

			//           ,     
			if(true == bMark[iNx][iNy])
			{
				continue;
			}

			//        ,   
			if(1 == iArrMaze[iNx][iNy])
			{
				continue;
			}

			Stat nextStat(iNx,iNy,curStat._iStep + 1);
			queueStat.push(nextStat);//       
			bMark[iNx][iNy] = true;   //       

			//        
			if(iNx == iEndX && iNy == iEndY)
			{
				return nextStat._iStep;//       
			}
		}
	}
	return -1;
}


void init()
{
	printf("        (m*n):");
	scanf("%d %d",&iM,&iN);
	printf("       (1   ,0   ):
"); for(int i = 0 ; i < iM ; i++) { for(int j =0 ; j < iN; j++) { //iArrMaze[i][j] = scanf("%d",*(iArrMaze + i ) + j); bMark[i][j] = false; } } printf("
:"); scanf("%d %d",&iBegX,&iBegY); printf("
:"); scanf("%d %d",&iEndX,&iEndY); } // , , 。 void DFS(int iBegX,int iBegY)// , { for(int i = 0 ; i < 4 ; i++ ) { int iNx = iBegX + iArrGo[i][0]; int iNy = iBegY + iArrGo[i][1]; // if(iNx < 0 || iNx >= iM || iNy < 0 || iNy >= iN) { continue; } // if(1 == iArrMaze[iNx][iNy]) { continue; } // if(iNx == iEndX && iNy == iEndY) { //printf("

"); isSuccess = true; return; } // , (1) iArrMaze[iNx][iNy] = 1; // DFS(iNx,iNy); // , , (0) iArrMaze[iNx][iNy] = 0; if(isSuccess == true) { return; } } //printf("

"); } void process() { Stat statBeg(iBegX,iBegY,0); queueStat.push(statBeg); int iRes = BFS(iM,iN); if(iRes != -1) { printf("
(%d,%d) %d (%d,%d)
",iBegX,iBegY,iRes,iEndX,iEndY); } else { printf("
(%d,%d) (%d,%d)
",iBegX,iBegY,iEndX,iEndY); } } /* : :9 , :9 :1,1 :7,7 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 */ int iMaze[9][9] = { {1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,1}, {1,0,1,1,0,1,1,0,1}, {1,0,1,0,0,1,0,0,1}, {1,0,1,0,1,0,1,0,1}, {1,0,0,0,0,0,1,0,1}, {1,1,0,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1} }; int startI = 1,startJ = 1;// int endI = 7 ,endJ = 7;// void printMaze() { for(int i = 0 ; i < 9 ; i++ ) { for(int j = 0 ; j < 9 ; j++) { if(iMaze[i][j]==1) { printf("#"); } else { printf(" "); } } printf("
"); } } void visit(int i,int j) { iMaze[i][j] = 2; if(i==endI && j==endJ) { printf("
:
"); for(int m = 0 ; m < 9 ; m++) { for(int n = 0 ; n < 9 ; n++) { if(iMaze[m][n]==1) { printf("#"); } else if(iMaze[m][n]==2) { printf("%"); } else { printf(" "); } } printf("
"); } } if(iMaze[i][j+1]==0) { visit(i,j+1); } if(iMaze[i+1][j]==0) { visit(i+1,j); } if(iMaze[i][j-1]==0) { visit(i,j-1); } if(iMaze[i-1][j]==0) { visit(i-1,j); } iMaze[i][j] = 0; } int main(int argc,char* argv[]) { /*init(); process(); DFS(iBegX,iBegY); if(isSuccess) { printf("
(%d,%d) (%d,%d)
",iBegX,iBegY,iEndX,iEndY); } else { printf("
(%d,%d) (%d,%d)
",iBegX,iBegY,iEndX,iEndY); }*/ visit(startI,startJ); system("pause"); getchar(); return 0; }

좋은 웹페이지 즐겨찾기