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

BFS乱搞AC

Posted by Tanko at 2016-01-05 20:26:26 on Problem 1945
注意三件事
1.把较大的数据放在同一个位置,并且可以证明较小的那个数据不超过200,超过就剪掉
2.hash判重
3.循环队列
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Maxdata 1000000

using namespace std;

int a[Maxdata][3];
int p,l,r,ans;
bool hash[20001][201];

void fill(int x,int y,int s)

{
	if (x<y) swap(x,y);
	
	if (x>20000) return;
	if (y>200) return;
	
	if (hash[x][y]==true) return;
	
	hash[x][y]=true;
	
	r++;
	if (r==Maxdata) r=0;
	a[r][0]=x;
	a[r][1]=y;
	a[r][2]=s+1;
	
	if (a[r][0]==p or a[r][1]==p) ans=a[r][2];
	
	
	return;
}

int bfs()

{
	a[0][0]=1;
	a[0][1]=0;
	a[0][2]=0;
	
	l=0;r=0;
	
	while (true)
	
	{
		fill(a[l][0]*2,a[l][0],a[l][2]);
		fill(a[l][1]*2,a[l][0],a[l][2]);
		fill(a[l][0]*2,a[l][1],a[l][2]);
		fill(a[l][1]*2,a[l][1],a[l][2]);
		fill(a[l][0]+a[l][1],a[l][0],a[l][2]);
		fill(a[l][0]+a[l][1],a[l][1],a[l][2]);
		fill(abs(a[l][0]-a[l][1]),a[l][0],a[l][2]);
		fill(abs(a[l][0]-a[l][1]),a[l][1],a[l][2]);
		
		if (ans!=-1) return ans;
		
		l++;
		if (l==Maxdata) l=0;
	}
	
}

int main()

{
	scanf("%d",&p);
	
	memset(hash,0,sizeof(hash));
	ans=-1;
	
	printf("%d",bfs());
	
	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