您的位置:首页 > 其它

深搜(dfs)HDU1010,1016

2011-03-25 18:26 176 查看
HDU1016

题目http://acm.hdu.edu.cn/showproblem.php?pid=1016

#include<iostream>
#include<cmath>
using namespace std;
int
n;
int
number[100],visited[100];
bool
isprime(int a)
{

int
flag=0;
for
(int i=2;i<=sqrt((double)a);i++)
{

if
(!(a%i))
{

return
false;
flag=1;
}
}

if
(!flag)
return
true;
}

void
dfs(int pe)
{

if
(pe==n&&isprime(number[0]+number[pe-1]))
{

for
(int i=0;i<n-1;i++)
cout<<number[i]<<" ";
cout<<number[n-1]<<endl;
}

for
(int i=2;i<=n;i++)
{

if
(!visited[i]&&isprime(number[pe-1]+i))//dfs加回溯。没有烦人的剪枝,嘿嘿!
{
visited[i]=1;
number[pe]=i;
dfs(pe+1);//比如这一次是最后一次过了,那么下一次dfs中pe就为n了,其实pe就是表示那个环中的第几个环,从0开始哦
visited[i]=0;//做了1016后,我算是比较清晰地认识了dfs了,就是每次都一搜到底,然后不行,就重新回溯,再搜到底,不行,再回溯。由深到浅啊。
} }
}

int
main(void)
{

int
count=1;
number[0]=1;
while
(cin>>n)
{

cout<<"Case "<<count++<<':'<<endl;
dfs(1);
cout<<endl;
}

return
0;
}


嘿嘿,终于知道什么叫DFS了,它与BFS的区别可能就是,DFS是一搜见底,不行了,回溯为上层,再一搜见底,,直到回溯到原始吧。这就是栈吧!1016,居然一次就AC了,幸福。。没有1010那么纠结,回想下1010.

HDU1010

题目http://acm.hdu.edu.cn/showproblem.php?pid=1010

代码:

#include<iostream>
#include<cmath>
using namespace std;

int
si,sj,di,dj,flag,t,n,m;
char
maze[7][7];
int
forward[4][2]={-1,0,0,1,1,0,0,-1};
bool
mark[7][7];

void
dfs(int x,int y,int s)
{

int
nx,ny;
if
(flag==1)
return
;
// cout<<t<<endl;
if((abs(di-x)+abs(dj-y))%2!=abs(t-s)%2)//剪枝,很重要,没有它,程序就tle
return ;
if
(s==t)
{

if
(x==di&&y==dj)
flag=1;
return
;
}

if
(abs(di-x)+abs(dj-y)>t-s)
return
;
for
(int i=0;i<4;i++)
{

nx=x+forward[i][0];
ny=y+forward[i][1];
if
(nx>=1 && nx<=n && ny>=1 && ny<=m && mark[nx][ny]==0 && maze[nx][ny]!='X')
{

mark[nx][ny]=1;
dfs(nx,ny,s+1);
mark[nx][ny]=0;
}
}
}

int
main(void)
{

int
wall,i,j;
while
(cin>>n>>m>>t,n||m||t)
{

for
(i=1;i<=n;i++)
for
(j=1;j<=m;j++)
mark[i][j]=0;
wall=0;flag=0;
for
( i=1;i<=n;i++)
for
( j=1;j<=m;j++)
{

cin>>maze[i][j];
if
(maze[i][j]=='S')
{

si=i;
sj=j;
mark[i][j]=1;
}

else if
(maze[i][j]=='D')
{

di=i;
dj=j;
}

else if
(maze[i][j]=='X')
{

wall++;
mark[i][j]=1;
}
}

if
(n*m-wall-1<t)
{

cout<<"NO"<<endl;
continue
;
}

dfs(si,sj,0);
flag? cout<<"YES"<<endl:cout<<"NO"<<endl;
}

return
0;
}
//哎,忘了注意全局变量t,,我把全局变量在主函数中重新定义,结果造成t在子函数中总为0,结果悲剧了。。。。哎,,有时候ac不了,纯粹是细节,细节。。纠结了一个晚上的DFS+剪枝题。第一次没有剪枝,悲剧了,tle.可见DFS的弱点还是挺明显的,盲目的搜索不是很OK啊,以后做题应多思考,能减少计算机运算一次,就减少一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: