HDU 1010  (AC)

HDU 1015    (AC)

HDU 1016     (AC)

HDU 1172   (AC)

HDU 1312   (AC)

POJ 2362  (AC,1011的弱化版,建议先做这题)

POJ  1011  (AC,强烈推荐)

POJ  3620

HDU 1010代码

/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date : 2014-03-24
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; char a[10][10];
int x_d[]={1,-1,0,0};
int y_d[]={0,0,-1,1}; int mabs(int i){return i>0?i:-i;}
int m,n,dr_i,dr_j;
int dfs(int x,int y,int t){
if(mabs(dr_i-x)+mabs(dr_j-y)>t){
return 0;
}
//奇偶剪枝
if(((mabs(x-dr_i)+mabs(y-dr_j))&1)==0&&(t&1)) return 0;
if(((mabs(x-dr_i)+mabs(y-dr_j))&1)&&(t&1)==0) return 0;
int i,j,k;
for(k=0;k<4;k++){
i=x+x_d[k];
j=y+y_d[k]; //四个方向
if(i<0||i>=n||j<0||j>=m) continue ;//保证不越界
if(t==1){
if(i==dr_i&&j==dr_j) return 1; //到了
continue;
}
if(a[i][j]!='.') continue;
a[i][j]='X';
if(dfs(i,j,t-1)) return 1;
a[i][j]='.'; }
return 0; }
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t;
int i,j;
int st_i,st_j;
while(cin>>n>>m>>t&&(n||m||t)){
for(i=0;i<n;i++)
for(j=0;j<m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
st_i=i;
st_j=j; }else if(a[i][j]=='D'){
dr_i=i;
dr_j=j; }
}
if(mabs(dr_i-st_i)+mabs(dr_j-dr_j)>t){
cout<<"NO\n";
continue;
} if(dfs(st_i,st_j,t)) cout<<"YES\n";
else cout<<"NO\n"; } #ifndef ONLINE_JUDGE
fclose(stdin);
#endif return 0; }

1016这题目,我觉得我的做法还是很暴力的,有了1010的基础……没参考任何人,写出来的。没有怎么优化。800MS……的确慢。。不过理解还是很容易的。。n

PE了一次,因为我没看到是每组都输出空行……最后一组测试输出空行就通过了。

/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date : 2014-03-27
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[][10]={{0},{2,4,6,10,12,16,18},
{1,3,5,9,11,15,17},
{2,4,8,10,14,16},
{1,3,7,9,13,15,19},
{2,6,8,12,14,18},
{1,5,7,11,13,17},
{4,6,10,12,16},
{3,5,9,11,15},
{2,4,8,10,14},
{1,3,7,9,13,19},
{2,6,8,12,18},
{1,5,7,11,17,19},
{4,6,10,16,18},
{3,5,9,15,17},
{2,4,8,14,16},
{1,3,7,13,15},
{2,6,12,14},
{1,5,11,13,19},
{4,10,12,18},
{3,9,11,17}};
int n;
int vist[22],nxt[22];
bool isprime(int k){
int t=2;
for(;t*t<=k;t++)
if(k%t==0) return 0; return 1; }
void dfs(int cur,int nt){ int i=0;
while(a[cur][i]!=0&&a[cur][i]<=n){ if(vist[a[cur][i]]==0){
vist[a[cur][i]]=1;
nxt[cur]=a[cur][i]; if(nt==2&&isprime(a[cur][i]+1)){
int p=1;
cout<<1;
while(nxt[p]!=a[cur][i]){
cout<<" "<<nxt[p];
p=nxt[p]; }
cout<<" "<<a[cur][i]<<endl;
vist[a[cur][i]]=0;
return ; }
dfs(a[cur][i],nt-1);
vist[a[cur][i]]=0; } i++;
} }
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int cs=0;
while(cin>>n){ cs++; memset(vist,0,sizeof(vist));
vist[1]=1;
cout<<"Case "<<cs<<":\n";
if(n==1) cout<<1<<endl;
else dfs(1,n);
cout<<endl; } #ifndef ONLINE_JUDGE
fclose(stdin);
#endif return 0; }

其实我也不知道1015叫做暴力呢,还是深搜,还是深搜暴力呢。。。

0ms通过,出乎我意料。。。我以为数据会很多。。。

从高位开始枚举,第一个结果输出即可。我用bitmap排了一下序。这么小的数据,用bitmap最合适不过了。。。so easy.1A

/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date : 2014-03-27
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
int target;
string psw;
int vist[30];
vector<int> v;
bool isF(int a,int b,int c,int d,int e)
{
int dd=d*d;
int ee=e*e;
//v - w^2 + x^3 - y^4 + z^5 = target
if(a-b*b+c*c*c-dd*dd+ee*ee*e==target)
{
return 1;
}
return 0; }
void dfs()
{
//a - b^2 + c^3 - d^4 + e^5 = target int a,b,c,d,e; int siz=v.size();
int i,j,k,l,m;
for(i=0; i<siz; i++)
{
if(vist[i]==-1) continue;
a=v[i];
vist[i]=-1;
for(j=0; j<siz; j++)
{
if(vist[j]==-1) continue;
b=v[j];
vist[j]=-1;
for(k=0; k<siz; k++)
{
if(vist[k]==-1) continue;
vist[k]=-1;
c=v[k];
for(l=0; l<siz; l++)
{
if(vist[l]==-1 ) continue;
vist[l]=-1;
d=v[l];
for(m=0; m<siz; m++)
{
if(vist[m]==-1) continue;
vist[m]=-1;
e=v[m]; if(isF(a,b,c,d,e))
{
cout<<(char)('A'-1+a)<<(char)('A'-1+b)<<(char)('A'-1+c)<<(char)('A'-1+d)<<(char)('A'-1+e)<<endl;
return;
}
vist[m]=0; //恢复 }
vist[l]=0; //恢复 }
vist[k]=0; //恢复
}
vist[j]=0; //恢复
}
vist[i]=0; //恢复 } cout<<"no solution\n"; }
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(cin>>target>>psw)
{
memset(vist,0,sizeof(vist));
if(target==0&&psw=="END") break;
int len=psw.length();
for(int i=0; i<len; i++)
vist[psw[i]-'A']=1;
v.clear();
for(int i=25; i>=0; i--)
if(vist[i]==1) v.push_back(i+1);
dfs(); } #ifndef ONLINE_JUDGE
fclose(stdin);
#endif return 0; }

HDU1172

/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date : 2014-04-01
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
class Num{
public:
Num(){}
int nb,n,k; };
int a[4];
int b[4];
int mp1[10];
int mp2[10]; bool isLegal(int i,Num N){ int j=N.nb,k,cnt=0;
for(k=0;k<4;k++){
a[k]=i%10;
i/=10;
b[k]=j%10;
j/=10;
if(a[k]==b[k]) cnt++; } if(cnt!=N.k){ return 0;}
//满足相同的数后
memset(mp1,0,sizeof(mp1));
memset(mp2,0,sizeof(mp2));
cnt=0;
for(k=0;k<4;k++){
mp1[a[k]]++;
mp2[b[k]]++;
}
for(k=0;k<10;k++){
cnt+=min(mp1[k],mp2[k]);
}
if(cnt!=N.n) return 0;
return 1; }
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int N,i,j;
vector<Num> v;
int res;
while(cin>>N&&N){
res=0;
v.clear();
v.resize(N);
for(i=0;i<N;i++){
cin>>v[i].nb>>v[i].n>>v[i].k;
}
for(i=1000;i<10000;i++){
for(j=0;j<N;j++){
if(!isLegal(i,v[j])){ //满足与否
break;
}
}
if(j==N){
if(res==0){
res=i; }else{ res=0; //第二次赋值,直接break.同时列入not sure状态,我没有用特殊的flag来区分,没必要~
break;
}
} }
if(res) cout<<res<<endl;
else cout<<"Not sure"<<endl; } #ifndef ONLINE_JUDGE
fclose(stdin);
#endif return 0; }

这题太暴力了~15MS 水过。。

hdu1312还是水题!

/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date : 2014-04-13
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char mp[30][30];
bool visit[30][30];
int dfs(int i,int j){ int cnt=0;
if(mp[i][j]=='.'&&visit[i][j]==0){
cnt++;
visit[i][j]=1;
cnt+=dfs(i+1,j);
cnt+=dfs(i,j-1);
cnt+=dfs(i-1,j);
cnt+=dfs(i,j+1);
return cnt; }
return cnt; }
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
int n,m;
char c;
int st_i,st_j;
while(cin>>n>>m&&(n||m)){
memset(visit,0,sizeof(visit));
memset(mp,'#',sizeof(mp));
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
cin>>c;
if(c=='@'){
st_i=i;
st_j=j;
}
mp[i][j]=c;
}
// cout<<st_i<<" "<<st_j<<endl;
int cnt=1;
cnt+=dfs(st_i+1,st_j);
// cout<<cnt<<"s1"<<endl;
cnt+=dfs(st_i,st_j-1);
// cout<<cnt<<"s2"<<endl;
cnt+=dfs(st_i-1,st_j);
// cout<<cnt<<"s3"<<endl;
cnt+=dfs(st_i,st_j+1);
cout<<cnt<<endl; } #ifndef ONLINE_JUDGE
fclose(stdin);
#endif return 0; }

poj 2362

很好的搜索剪枝!!!

/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date : 2014-04-13
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int M[25];
bool visit[25];
int edge,n;
bool dfs(int num,int len,int beg){
if(num==3){
return true;
}
for(int i=beg;i<=n;i++){
if(!visit[i]){
visit[i]=1; if(len+M[i]==edge&&dfs(num+1,0,0)){
return true; ;
}
if(len+M[i]<edge&&dfs(num,len+M[i],i+1)){
return true; } visit[i]=0; } } return false; } int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
int T;
while(cin>>T){
while(T--){
cin>>n;
edge=0;
for(int i=1;i<=n;i++){
cin>>M[i];
edge+=M[i]; }
if(edge%4!=0){
cout<<"no\n";
}else{
edge>>=2;
sort(M+1,M+n+1);
if(M[1]==M[n]){ if(n%4==0){
cout<<"yes\n";
}else{
cout<<"no\n";
} }else{
memset(visit,0,sizeof(visit));
if(M[n]>edge) cout<<"no\n";
else if(dfs(0,0,0)) cout<<"yes\n";
else cout<<"no\n"; } }
/*
for(int i=1;i<=n;i++)
cout<<M[i]<<endl;
*/ } } #ifndef ONLINE_JUDGE
fclose(stdin);
#endif return 0; }

poj 1011

大开眼界的剪枝。

/*******************************************************************************/
/* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
* Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
* Encoding : UTF8
* Date : 2014-04-13
* All Rights Reserved by yaolong.
*****************************************************************************/
/* Description: ***************************************************************
*****************************************************************************/
/* Analysis: ******************************************************************
*****************************************************************************/
/*****************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int M[80];
bool visit[80];
int edge,n,p,sum;
bool cmp(int a,int b){
return a>b;
}
bool dfs(int num,int len,int beg){
if(num==p){
return true;
}
int sample=-1;
for(int i=beg;i<=n;i++){
if(!visit[i]&&M[i]!=sample){
visit[i]=1; if(len+M[i]==edge){
if(dfs(num+1,0,0))
return true; ;
sample=M[i];
}
else if(len+M[i]<edge){
if(dfs(num,len+M[i],i+1))
return true;
sample=M[i];
} visit[i]=0;
if(len==0) break; } } return false; }
int solve(){ for(int len=M[1];len<=sum-len;len++){
if(sum%len==0){ memset(visit,0,sizeof(visit));
p=sum/len;
edge=len;
// cout<<p<<endl;;
if(dfs(0,0,0)){
return len;
}; } }
return sum; }
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif while(cin>>n&&n){ sum=0;
for(int i=1;i<=n;i++){
cin>>M[i];
sum+=M[i]; } sort(M+1,M+n+1,cmp);
// cout<<M[1]<<endl;
int ans=solve();
cout<<ans<<endl; }
/*
for(int i=1;i<=n;i++)
cout<<M[i]<<endl;
*/ #ifndef ONLINE_JUDGE
fclose(stdin);
#endif return 0; }

DFS的基础训练清单的更多相关文章

  1. [LeetCode] Course Schedule 课程清单

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  2. leetcode题目清单

    2016-09-24,开始刷leetcode上的算法题,下面整理一下leetcode题目清单.Github-leetcode 1.基本数学 Two Sum Palindrome Number Cont ...

  3. [LeetCode] 207. Course Schedule 课程清单

    There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...

  4. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  5. Java实现 LeetCode 638 大礼包(阅读理解题,DFS)

    638. 大礼包 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单.请输 ...

  6. DFS文件服务器实验手册

    基础配置信息清单 计算机名 角色 网络配置 DNS WIN-6E DC 11.1.1.10/24 127.0.0.1 WIN-C4 Node1 11.1.1.20/24 11.1.1.10 WIN-4 ...

  7. RMS:不能对生产服务器使用测试清单

    问题说明:在使用office软件RMS加密时报:不能对生产服务器使用测试清单,或者使用 rmsbulk.exe进行RMS加密时,报不能连接到RMS服务器. 解决办法: 请到https://suppor ...

  8. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  9. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

随机推荐

  1. AudioMixer的脚本控制

    AudioMixer是Unity5新特性之一,能很好的实现立体声效果. 这儿先记录一下脚本控制的方法: 1.添加一个Group,然后点击它 2.右侧面板上出现2个参数:pitch(速度)和volume ...

  2. [转]Angular, Backbone, or Ember: Which is Best for your Build?

    In order to choose which framework is right for your build, we've asked four important questions of ...

  3. spark高级排序彻底解秘

    排序,真的非常重要! RDD.scala(源码) 在其,没有罗列排序,不是说它不重要! 1.基础排序算法实战 2.二次排序算法实战 3.更高级别排序算法 4.排序算法内幕解密 1.基础排序算法实战 启 ...

  4. hdoj 4006 The kth great number【优先队列】

    The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Oth ...

  5. Code Forces Gym 100971D Laying Cables(单调栈)

    D - Laying Cables Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u ...

  6. ASP.NET- 播放视频代码

    在网上找的,还不错,支持很多格式.只需要在页面放个lable,建一个放视频文件的文件夹movie,加入代码: protected void Page_Load(object sender, Event ...

  7. iOS 视频播放的简单使用

    最近工作中有用到视频播放的内容,分享一些简单的用法给大家(由于网速问题,本例中使用的是本地的资源进行播放,要播放网络上的修改一些URL即可) 1.iOS9之前的视频播放 首先需要导入MediaPlay ...

  8. 1032 - Intersecting Dates

    A research group is developing a computer program that will fetch historical stock market quotes fro ...

  9. Tomcat配置gzip压缩

    HTTP 压缩能够大大提高浏览站点的速度,它的原理是,在client请求网 页后,从server端将网页文件压缩,再下载到client,由client的浏览器负责解 压缩并浏览.相对于普通的浏览过程H ...

  10. careercup-栈与队列 3.3

    3.3 栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下.因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起.实现数据结构SetOfStacks 来模拟这种情况.Se ...