poj3009 阅读理解


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 22
#define ll long long
const int zx[4]={0,0,-1,1};
const int zy[4]={-1,1,0,0};
const int inf=~0U>>1;
const double eps=1e-6;
int n,m,ans;
int a[N][N],vis[N][N];
struct Node
{
	int x,y,bs;
}st,ed;
void input()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j]==2)st.x=i,st.y=j;
			else if(a[i][j]==3)ed.x=i,ed.y=j;
		}
}
int ok(int x,int y)
{
	if(x<1 || x>n || y<1 || y>m)return 0;
	if(a[x][y]==1)return 1;
	if(a[x][y]==3)return 3;
	return 2;
}
void dfs(int x,int y,int sum)
{
	if(sum>=ans || sum>10)return;
	if(x==ed.x && y==ed.y)
	{
		ans=min(ans,sum);
		return;
	}
	for(int i=0;i<4;i++)
	{
		int nx=x+zx[i],ny=y+zy[i];
		int tmp=ok(nx,ny);
		if(tmp<2)continue;
		if(tmp==2)
		{
			while(ok(nx,ny)==2)nx+=zx[i],ny+=zy[i];
			int tmp1=ok(nx,ny);
			if(tmp1==1)
			{
				a[nx][ny]=0;
				dfs(nx-zx[i],ny-zy[i],sum+1);
				a[nx][ny]=1;
			}
			else if(tmp1==3) dfs(nx,ny,sum+1);
		}
		else dfs(nx,ny,sum+1);
	}
}
void solve()
{
	ans=inf;
	dfs(st.x,st.y,0);
	if(ans==inf)cout<<-1<>m>>n)
	{
		if(n==0 && m==0)break;
		input();
		solve();
	}
	return 0;
}


你可能感兴趣的:(poj3009 阅读理解)