C 언어 는 미로 로 간다
묘사 하 다.
미궁 을 하나 주 고 출발점 에서 종점 까지 갈 수 있 느 냐 고 물 으 면 상하 좌우 로 만 갈 수 있 고,비스듬히 걸 을 수 없다.
입력
여러 조 의 테스트 데 이 터 는 각 조 의 첫 줄 에 두 개의 정수 로 각각 n 과 m 이다.
n.이 미로 에는 n 행 m 열(0
길 을 표시 하 다
벽
'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;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.