【FZUOJ 1046】Tempter of the Bone(DFS加奇偶剪枝)

Accept: 623    Submit: 1734
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.

The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.


 Input

The input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:

'X': a block of wall, which the doggie cannot enter; 
'S': the start point of the doggie; 
'D': the Door; or
'.': an empty block.

The input is terminated with three 0's. This test case is not to be processed.

 Output

For each test case, print in one line "YES" if the doggie can survive, or "NO" otherwise.

 Sample Input

4 4 5S.X...X...XD....3 4 5S.X...X....D0 0 0

 Sample Output

NOYES

 Source

ZOJ 2110

我们如果想从(x,y)走到终点(dx,dy),最短的距离应当为abs(dx-x)+abs(dy-dy),假设这个距离为D1,如果存在D2能走到终点,那么D2的奇偶性一定和D1相同,因为起点相同,终点相同如果在横轴上面加1,那么在纵轴上面也应该加1,所以我们在深搜之前可以先进行剪枝一下。这样时间复杂度会降低很多。

#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
char maze[100][100];
int n,m,T;
int flag;
int sx,sy,dx,dy;
int vis[100][100];
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
void dfs(int x,int y,int t)
{
	int nx,ny;
	if(x==dx&&y==dy&&t==T)
	{
		flag=1;
		return ;
	}
	if(x<0&&x>=n||y<0||y>=m) return ;
	int temp1=abs(dx-x)+abs(dy-y);
	int temp2=abs(T-t);
	int temp=abs(temp1-temp2);//剪枝 
	if(temp&1) return ;
	for(int i=0;i<4;i++)
	{
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(maze[nx][ny]!='X'&&!vis[nx][ny]&&nx>=0&&nx<n&&ny>=0&&ny<m)
		{
			vis[nx][ny]=1;
			dfs(nx,ny,t+1);
			if(flag) return ;
			vis[nx][ny]=0;//回溯 
		}
	}
	
}
int main()
{
	while(cin>>n>>m>>T)
	{
		flag=0;
		memset(vis,0,sizeof(vis));
		if(n+m+T==0) break;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				cin>>maze[i][j];
			}
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(maze[i][j]=='D')
				{
					dx=i;
					dy=j;
				}
				else if(maze[i][j]=='S')
				{
					sx=i;
					sy=j;
					vis[i][j]=1;
				}
			}
		}
		dfs(sx,sy,0);
		if(flag) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

Tempter of the Bone

01-04

The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.nnThe maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.nnnInputnnThe input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:nn'X': a block of wall, which the doggie cannot enter; n'S': the start point of the doggie; n'D': the Door; orn'.': an empty block.nnThe input is terminated with three 0's. This test case is not to be processed.nnnOutputnnFor each test case, print in one line "YES" if the doggie can survive, or "NO" otherwise.nnnSample Inputnn4 4 5nS.X.n..X.n..XDn....n3 4 5nS.X.n..X.n...Dn0 0 0nnnSample OutputnnNOnYES

Tempter of the Bone again

06-09

Problem DescriptionnIgnatius found some bones in an ancient maze, which fascinated him a lot. However, when he picked them up, the maze began to shake, and Ignatius could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.nSuddenly, Ignatius heard a very very cool voice, and he recognize that it comes from Beelzebub feng5166:“I know that you like bone, and even I know your nick name is wishingbone. Today, I give you a chance to survive: there are N kinds of bones here and the number of each kind bone is enough, their weights are Wi pounds (1<=i<=N), your bag has a volume of M pounds, and I also know that you will spend 3 seconds time when you pick up any one bone. Today, you must fill up your bag as quick as you can, otherwise, the maze is your place of the death!”. nOh, my god! Can the poor Ignatius survive? Please help him!nNote: You are guarantied that solution always exist for every test case. n nnInputnThe input consists of multiple test cases. The first line of each test case contains two integers N and M (1 < N < 10; 0 < M < 1000000000), which denote the kinds of the bone and the capacity of the bag respectively. The next line give N integers W1…Wn (1<=wi<=100), which indicate the weights of bonesnThe input is terminated with two 0's. This test case is not to be processed.n nnOutputnFor each test case, print the minimal time Ignatius will spend when he can survive. One line per case.n nnSample Inputn2 20n1 5n0 0n nnSample Outputn12

Tempter of the Bone II

10-28

Problem DescriptionrnThe doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze was changed and the way he came in was lost.He realized that the bone was a trap, and he tried desperately to get out of this maze.rnrnrnThe maze was a rectangle with the sizes of N by M. The maze is made up of a door,many walls and many explosives. Doggie need to reach the door to escape from the tempter. In every second, he could move one block to one of the upper, lower, left or right neighboring blocks. And if the destination is a wall, Doggie need another second explode and a explosive to explode it if he had some explosives. Once he entered a block with explosives,he can take away all of the explosives. Can the poor doggie survive? Please help him.rn rnrnInputrnThe input consists of multiple test cases. The first line of each test case contains two integers N, M,(2 <= N, M <= 8). which denote the sizes of the maze.The next N lines give the maze layout, with each line containing M characters. A character is one of the following:rnrn'X': a block of wall; rn'S': the start point of the doggie; rn'D': the Door;rn'.': an empty block;rn'1'--'9':explosives in that block.rnrnNote,initially he had no explosives.rnrnThe input is terminated with two 0's. This test case is not to be processed.rn rnrnOutputrnFor each test case, print the minimum time the doggie need to escape if the doggie can survive, or -1 otherwise.rn rnrnSample Inputrn4 4rnSX..rnXX..rn....rn1..Drn4 4rnS.X1rn....rn..XXrn..XDrn0 0rn rnrnSample Outputrn-1rn9

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试