알고리즘 배선 문제
2278 단어 알고리즘 학습 노트
문제 분석: 시작 위치 a 부터 이 를 첫 번 째 확장 노드 로 하고 이 노드 와 인접 하 며 도착 할 수 있 는 격자 가 실행 가능 한 노드 가 되 어 활성 노드 대기 열 에 가입 하고 이 격자 들 을 1 로 표시 합 니 다. 즉, 시작 격자 a 에서 이 격자 까지 의 거 리 는 1 입 니 다.이 어 활성 점 대기 열 에서 팀 의 첫 번 째 노드 를 꺼 내 다음 확장 점 으로 하고 이때 확장 점 과 인접 하고 표시 되 지 않 은 격자 를 2 로 기록 하고 활성 점 대기 열 에 저장 합 니 다.이 과정 은 알고리즘 이 대상 격자 b 나 활성 점 대기 열 이 비어 있 을 때 까지 계 속 됩 니 다.
#include
#include
using namespace std;
#define n 7//
#define m 7
int a[n][m]={
0,0,-1,0,0,0,0,
0,0,-1,-1,0,0,0,
0,0,0,0,-1,0,0,
0,0,0,-1,-1,0,0,
-1,0,0,0,-1,0,0,
-1,-1,-1,0,0,0,0,
-1,-1,-1,0,0,0,0
};// (-1 )
int s[n][m];//
int dist = 1;//
// (px,py) ,
bool AddIntoS(int px,int py,int s[n][m],int a[n][m])
{
if(px<0||px>n-1||py<0||py>m-1||a[px][py]!=0||s[px][py]==-1)return false;
a[px][py]=dist;
s[px][py]=1;
return true;
}
// , -1
int FindOfIndexFromS(int s[n][m])
{
for(int i=0;i0)return i*m+j;
return -1;
}
// (sx,sy), (ex,ey)
void FindPath(int sx,int sy,int ex,int ey,int s[n][m],int a[n][m])
{
AddIntoS(sx+1,sy,s,a);
AddIntoS(sx-1,sy,s,a);
AddIntoS(sx,sy+1,s,a);
AddIntoS(sx,sy-1,s,a);//
while(true)
{
int index=FindOfIndexFromS(s);
if(index==-1)break;
int px=index/m,
py=index%m;
dist=a[px][py]+1;
s[px][py]=-1;
AddIntoS(px+1,py,s,a);
if(px+1==ex&&py==ey)break;
AddIntoS(px-1,py,s,a);
if(px-1==ex&&py==ey)break;
AddIntoS(px,py+1,s,a);
if(px==ex&&py+1==ey)break;
AddIntoS(px,py-1,s,a);
if(px==ex&&py-1==ey)break;
}
int temp=dist-1;
while(temp>0)// , 1
{
if(a[ex+1][ey]==temp)ex++;
else if(a[ex-1][ey]==temp)ex--;
else if(a[ex][ey+1]==temp)ey++;
else if(a[ex][ey-1]==temp)ey--;
else {
cout<