Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

怎么老是WA啊?

Posted by mlh at 2010-03-03 14:29:53 on Problem 3083
#include<iostream>
using namespace std;
int maze[41][41],maze2[41][41],maze3[41][41],H=0,W=0,end[2],ans=0;
bool isOK=false;
struct point
{
	int x,y;
}next;
void findLeast(int x,int y,int step)
{
	step++;
	maze[x][y]=step;
	if(x==end[0] && y==end[1])
	{
		isOK=true;
		ans=step;
	}

	if(x>0 && !isOK && maze[x-1][y]==0)
	{
		findLeast(x-1,y,step);
		maze[x-1][y]=step;
	}
	if(y>0 && !isOK && maze[x][y-1]==0)
	{
		findLeast(x,y-1,step);
		maze[x][y-1]=step;
	}
	if(x<H-1 && !isOK && maze[x+1][y]==0)
	{
		findLeast(x+1,y,step);
		maze[x+1][y]=step;
	}
	if(y<W-1 && !isOK && maze[x][y+1]==0)
	{
		findLeast(x,y+1,step);
		maze[x][y+1]=step;
	}
}

bool isDirectOK(int x,int y,int direct,point &n, int m[41][41])
{
	if(direct==0 && y>0)
	{
		if(m[x][y-1]>=0)
		{
			n.x=x;
			n.y=y-1;
			return true;
		}
	}else if(direct==1 && x>0)
	{
		if(m[x-1][y]>=0)
		{
			n.x=x-1;
			n.y=y;
			return true;
		}
	}else if(direct==2 && y<W-1)
	{
		if(m[x][y+1]>=0)
		{
			n.x=x;
			n.y=y+1;
			return true;
		}
	}else if(direct==3 && x<H-1)
	{
		if(m[x+1][y]>=0)
		{
			n.x=x+1;
			n.y=y;
			return true;
		}
	}
	return false;
}

void findLeft(int x,int y,int &step,int nowDirect)
{
	int leftDirect=(nowDirect+3)%4;
	int rightDirect=(nowDirect+5)%4;
	int backDirect=(nowDirect+2)%4;
	maze2[x][y]=step++;
	if(x==end[0] && y==end[1])
	{
		isOK=true;
	}
	if(isDirectOK(x,y,leftDirect,next,maze2) && !isOK)
	{
		findLeft(next.x,next.y,step,leftDirect);
		maze2[next.x][next.y]=0;
	}
	if(nowDirect==0 && !isOK && y>0 && maze2[x][y-1]>=0)
	{
		findLeft(x,y-1,step,nowDirect);
		maze2[x][y-1]=0;
	}
	if(nowDirect==1 && !isOK && x>0 && maze2[x-1][y]>=0)
	{
		findLeft(x-1,y,step,nowDirect);
		maze2[x-1][y]=0;
	}
	if(nowDirect==2 && !isOK && y<W-1 && maze2[x][y+1]>=0)
	{
		findLeft(x,y+1,step,nowDirect);
		maze2[x][y+1]=0;
	}
	if(nowDirect==3 && !isOK && x<H-1 && maze2[x+1][y]>=0)
	{
		findLeft(x+1,y,step,nowDirect);
		maze2[x+1][y]=0;
	}
	if(isDirectOK(x,y,rightDirect,next,maze2) && !isOK)
	{
		findLeft(next.x,next.y,step,rightDirect);
		maze2[next.x][next.y]=0;
	}
	if(isDirectOK(x,y,backDirect,next,maze2) && !isOK)
	{
		findLeft(next.x,next.y,step,backDirect);
		maze2[next.x][next.y]=0;
	}
}

void findRight(int x,int y,int &step,int nowDirect)
{
	int leftDirect=(nowDirect+3)%4;
	int rightDirect=(nowDirect+5)%4;
	int backDirect=(nowDirect+2)%4;
	maze3[x][y]=step++;
	if(x==end[0] && y==end[1])
	{
		isOK=true;
	}
	if(isDirectOK(x,y,rightDirect,next,maze3) && !isOK)
	{
		findRight(next.x,next.y,step,rightDirect);
		maze3[next.x][next.y]=0;
	}
	if(nowDirect==0 && !isOK && y>0 && maze3[x][y-1]>=0)
	{
		findRight(x,y-1,step,nowDirect);
		maze3[x][y-1]=0;
	}
	if(nowDirect==1 && !isOK && x>0 && maze3[x-1][y]>=0)
	{
		findRight(x-1,y,step,nowDirect);
		maze3[x-1][y]=0;
	}
	if(nowDirect==2 && !isOK && y<W-1 && maze3[x][y+1]>=0)
	{
		findRight(x,y+1,step,nowDirect);
		maze3[x][y+1]=0;
	}
	if(nowDirect==3 && !isOK && x<H-1 && maze3[x+1][y]>=0)
	{
		findRight(x+1,y,step,nowDirect);
		maze3[x+1][y]=0;
	}
	if(isDirectOK(x,y,leftDirect,next,maze3) && !isOK)
	{
		findRight(next.x,next.y,step,leftDirect);
		maze3[next.x][next.y]=0;
	}
	if(isDirectOK(x,y,backDirect,next,maze3) && !isOK)
	{
		findRight(next.x,next.y,step,backDirect);
		maze3[next.x][next.y]=0;
	}
}

int findDirect(int x,int y)
{
	if(x==0)
	{
		return 3;
	}else if(x==H-1)
	{
		return 1;
	}else if(y==0)
	{
		return 2;
	}else if(y==W-1)
	{
		return 0;
	}

}

int main()
{
	int n=0,start[2]={0},firstDirect=0;
	char c;
	scanf("%d",&n);
	for(int x=0;x<n;x++)
	{
		scanf("%d%d",&W,&H);
		memset(maze,0,sizeof(maze));
		for(int i=0;i<H;i++)
		{
			for(int j=0;j<W;)
			{
				scanf("%c",&c);
				if(c=='#')
				{
					maze[i][j++]=-1;
				}else if(c=='.')
				{
					maze[i][j++]=0;
				}else if(c=='S')
				{
					start[0]=i;
					start[1]=j++;
				}else if(c=='E')
				{
					end[0]=i;
					end[1]=j++;
				}
			}
		}
		memcpy(maze2,maze,sizeof(maze));
		memcpy(maze3,maze,sizeof(maze));
		firstDirect=findDirect(start[0],start[1]);
		isOK=false;
		ans=0;
		findLeft(start[0],start[1],ans,firstDirect);
		printf("%d ",ans);
		isOK=false;
		ans=0;
		findRight(start[0],start[1],ans,firstDirect);
		printf("%d ",ans);
		ans=0;
		isOK=false;
		findLeast(start[0],start[1],ans);
		printf("%d\n",ans);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator