ZOJ1430 POJ1697 The Erythea Campaign
/*******************************************************************************
# Author : Neo Fung
# Email : [email protected]
# Last modified: 2011-11-06 21:50
# Filename: ZOJ1430 POJ1697 The Erythea Campaign.cpp
# Description :
******************************************************************************/
// #include "stdafx.h"
// #define DEBUG
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <memory.h>
#include <limits.h>
#include <queue>
#define MAX 85
using namespace std;
int map[MAX][MAX];
int level[MAX][MAX];
int result[MAX][MAX];
int n,m;
struct NODE
{
int x,y;
int lev;
}end,start,ntemp;
queue<NODE> mq;
bool canNotVisit(const int &x,const int &y,const int mode)
{
if(mode<4)
{
if(mode==0)
return map[x-1][y-1] && map[x-1][y];
else
return map[x][y] && map[x][y-1];
}
else
{
if(mode==4)
return map[x][y-1] && map[x-1][y-1];
else
return map[x][y] && map[x-1][y];
}
}
void pushQueue(const int &x,const int &y,const int &lev)
{
NODE temp;
temp.x=x;
temp.y=y;
temp.lev=lev;
mq.push(temp);
}
int main(void)
{
#ifdef DEBUG
freopen("data.txt","r",stdin);
#endif
int dis[]={-1,0,1,0,0,-1,0,1};
int ncases;
char ch;
int x,y,lev,a,b;
scanf("%d",&ncases);
while(ncases--)
{
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);
memset(map,0,sizeof(map));
memset(level,0,sizeof(level));
for (int i=0;i<=n;++i)
for (int j=0;j<=m;++j)
result[i][j]=INT_MAX;
for(int i=0;i<n;++i)
{
getchar();
for(int j=0;j<m;++j)
{
scanf("%c",&ch);
map[i][j]=ch-'0';
if(map[i][j])
{
level[i][j]=level[i][j+1]=level[i+1][j]=level[i+1][j+1]=n+m;
pushQueue(i,j,n+m);
pushQueue(i,j+1,n+m);
pushQueue(i+1,j,n+m);
pushQueue(i+1,j+1,n+m);
}
}
}
while(!mq.empty())
{
ntemp=mq.front();
mq.pop();
x=ntemp.x,y=ntemp.y,lev=ntemp.lev-1;
for(int i=0;i<8;i+=2)
{
a=x+dis[i];
b=y+dis[i+1];
if(a>=0 &&a<=n &&b>=0 &&b<=m && !canNotVisit(x,y,i) && lev>level[a][b])
{
level[a][b]=lev;
ntemp.x=a;
ntemp.y=b;
ntemp.lev=lev;
mq.push(ntemp);
}
}
}
start.lev=result[start.x][start.y]=level[start.x][start.y];
end.lev=level[end.x][end.y];
mq.push(start);
while(!mq.empty())
{
ntemp=mq.front();
mq.pop();
x=ntemp.x;
y=ntemp.y;
lev=ntemp.lev;
for(int i=0;i<8;i+=2)
{
a=x+dis[i];
b=y+dis[i+1];
if(a>=0 &&a<=n &&b>=0 &&b<=m && !canNotVisit(x,y,i) && lev+level[a][b]<result[a][b])
{
result[a][b]=lev+level[a][b];
ntemp.x=a;
ntemp.y=b;
ntemp.lev=result[a][b];
mq.push(ntemp);
}
}
}
if(result[end.x][end.y]==INT_MAX)
printf("no solution
");
else
printf("%d
",result[end.x][end.y]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.