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

Re:总结一下下大家可能的错误吧

Posted by robinho364 at 2013-10-19 18:48:28 on Problem 3009
In Reply To:总结一下下大家可能的错误吧 Posted by:TSERROF at 2012-10-13 17:06:27
> 1.没回溯
> 2.dfs的话要搜索完整,不要搜到一个就停了,这样搜到不到最短
> 3.旁边是墙的话不能直接把墙碰碎
> 4.最好不规定方向吧,因为总是可以往四个方向走的。最开始我为了剪枝规定了不能往来的方向走,结果发现这么剪枝是错的
> 5.行列弄反了
> 6.还有路过终点就算赢了
> 最后附个渣代码,好歹也过了至少思想是对滴
> #include <iostream>
> #include <cstring>
> using namespace std;
> int w,h,board[25][25],si,sj,cnt,ans;
> bool DFS(int i,int j)
> {
> 	if(cnt>10)return false;
> 	if(board[i][j]==3)
> 	{ 
> 		if(ans>cnt){ ans=cnt;return true;}
> 		else return false;
> 	}
> 	if(i<1 || i> h || j<1 || j>w )return false;
> 	bool is_find=false;
> 	for(int k=1;k<=4;++k)
> 	{
> 		int di=i,dj=j,bi=-1,bj=-1;
> 		switch (k)
> 		{
> 		default:
> 			break;
> 		case 1:
> 			while(di>0)
> 			{
> 				if( board[di][dj]==3)break;
> 				if(board[di][dj]==1){ board[di][dj]=0;bi=di,bj=dj;++di;break;}
> 				--di;
> 			}
> 			break;
> 		case 3:
> 			while(di<=h)
> 			{
> 				if( board[di][dj]==3)break;
> 				if(board[di][dj]==1){ board[di][dj]=0;bi=di,bj=dj;--di;break;}
> 				++di;
> 			}
> 			break;
> 		case 4:
> 			while(dj>0)
> 			{
> 				if( board[di][dj]==3)break;
> 				if(board[di][dj]==1){ board[di][dj]=0;bi=di,bj=dj;++dj;break;}
> 				--dj;
> 			}
> 			break;
> 		case 2:
> 			while(dj<=w)
> 			{
> 				if( board[di][dj]==3)break;
> 				if(board[di][dj]==1){ board[di][dj]=0;bi=di,bj=dj;--dj;break;}
> 				++dj;
> 			}
> 			break;
> 		}
> 		if(di==i && dj==j){ if(bi!=-1 && bj!=-1)board[bi][bj]=1;continue;}
> 		++cnt;
> 		if(DFS(di,dj))is_find=true;
> 		--cnt;
> 		if(bi!=-1 && bj!=-1)board[bi][bj]=1;
> 	}
> 	if(is_find)return true;
> 	else return false;
> }
> int main()
> {
> 	while(cin>>w>>h && (w || h))
> 	{
> 		memset(board,0,sizeof(board));
> 		for(int i=1;i<=h;++i)
> 			for(int j=1;j<=w;++j)
> 			{
> 				cin>>board[i][j];
> 				if(board[i][j]==2)si=i,sj=j;
> 			}
> 		cnt=0,ans=15;
> 		if(DFS(si,sj))cout<<ans<<endl;
> 		else cout<<-1<<endl;
> 	}
> 	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