C 언어 는 미로 로 간다

본 논문 의 사례 는 C 언어 가 미로 로 가 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
묘사 하 다.
미궁 을 하나 주 고 출발점 에서 종점 까지 갈 수 있 느 냐 고 물 으 면 상하 좌우 로 만 갈 수 있 고,비스듬히 걸 을 수 없다.
입력
여러 조 의 테스트 데 이 터 는 각 조 의 첫 줄 에 두 개의 정수 로 각각 n 과 m 이다.
n.이 미로 에는 n 행 m 열(0다음은 n 행 m 열,
길 을 표시 하 다

'S'는 출발점 을 나타 낸다.
'T'는 종점 을 나타 낸다.
출력
각 그룹의 테스트 데 이 터 는 하나의 결 과 를 출력 합 니 다.S 에서 T 로 갈 수 있다 면"YES"를 출력 합 니 다.그렇지 않 으 면"NO"를 출력 합 니 다.
입력 예시:
2 2
S*
#T
3 3
S*#
#T
##
출력 예시:
YES
NO
이 문 제 를 해결 할 수 있 는 두 가지 방법 이 있다.
첫 번 째 깊이 우선 검색:입구 에 서서 자신 이 다음 에 어디로 갈 수 있 는 지,다음 위치 로 갈 수 있 는 지 를 고려 한 다음 에 다음 에 어떻게 가 는 지,길이 없 을 때 까지 계속 걸 어간 다음 에 가장 가 까 운 갈림길 로 돌아 가 시도 하지 않 은 다른 길 을 선택 합 니 다.만약 에 갈 수 없다 면 다른 길 을 시도 합 니 다.이 갈림길 의 길 을 모두 시도 할 때 까지.다시 이전 길목 으로 돌아 가 출구 까지 갈 수 있 는 지 없 는 지 를 보 는 것 은 한 길이 어두 운 곳 까지 가 는 것 과 같다.

#include<bits/stdc++.h>

using namespace std;
char a[20][20];  //        
int flag,m,n;
int sdep_x[4]={-1,1,0,0},sdep_y[4]={0,0,-1,1};//        
int vis[20][20]; //      
void dfs(int x,int y)
{
 vis[x][y]=1; //       
 if(a[x][y]=='T') //    
 {
  flag=1;
  return;
 }
  for(int i=0;i<4;i++) //    
  {
   int h=x+sdep_x[i];
   int l=y+sdep_y[i];
   if(a[h][l]!='*'&&!vis[h][l]&&h>=0&&h<n&&l>=0&&l<m)//       
   {
    dfs(h,l);
   }
  }
}

int main()
{
 while(cin>>n>>m)
 {
  memset(vis,0,sizeof(vis));//     
  flag=0;
  int f,g;
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++) 
    cin>>a[i][j];
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++)
   {
    if(a[i][j]=='S')//     
    {
     f=i;
     g=j;
    }
   }
  dfs(f,g);
  if(flag)
   cout<<"YES"<<endl;
  else
   cout<<"NO"<<endl;
 }
 return 0;
}
두 번 째 방법 은 범위 우선 검색:이 단계 이후 에 다음 단계 의 모든 길 을 열거 합 니 다.그 후의 모든 확장 중에서 하 나 를 다음 단계 로 하고 이 단계 가 도착 할 수 있 는 모든 다음 단 계 를 모두 열거 한 다음 에 두 번 째 단계 의 다른 선택 중의 모든 단 계 를 하나씩 확장 합 니 다.매번 확장 합 니 다.확 장 된 곳 이 검색 요구 에 도 달 했 는 지 확인 해 야 합 니 다.
하나의 대기 열 을 정의 할 수 있 습 니 다.확 장 된 점 위 치 를 대기 열 에 저장 하고 확 장 된 점 을 대기 열 에 저장 할 수 있 습 니 다.

#include<bits/stdc++.h>
using namespace std;
int vis[20][20];
char a[20][20];
int n,m;
int step_x[4]={-1,1,0,0},step_y[4]={0,0,-1,1};
struct data//       ,    x,y                                                           
{
 int x;
 int y;
};
data s,p;//         
queue<data>q;//      q
int BFS()
{
 while(!q.empty())//       
 {
  p=q.front();//          
  vis[p.x][p.y]=1;
  q.pop();//           
  if(a[p.x][p.y]=='T')//      
   return 1;
  else
  {
   for(int i=0;i<4;i++)
   {
    s.x=p.x+step_x[i];
    s.y=p.y+step_y[i];
    if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&!vis[s.x][s.y]&&a[s.x][s.y]!='*')//    
     q.push(s);//            
   }
  }
 }
 return 0;
}
int main()
{
 while(cin>>n>>m)
 {
  while(!q.empty())
  {
   q.pop();//        
  }
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++)
   cin>>a[i][j];
   for(int i=0;i<n;i++)
   {
   for(int j=0;j<m;j++)
   {
    vis[i][j]=0;
    if(a[i][j]=='S')
    {
     s.x=i;
     s.y=j;
     q.push(s);//           
    }
   }
   }
   if(BFS())
   cout<<"YES"<<endl;
   else
   cout<<"NO"<<endl;

 }
 return 0;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기