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啊,以后做题应多思考,能减少计算机运算一次,就减少一次。