DFS
POJ 1979: Red and Black
简单的DFS找四联通块即可。
代码如下
/*
*/
#define method_1
#ifdef method_1
/*
*/
#include
#include
#include
#include
#include
#include
POJ 3009: Curling 2.0
冰球的移动规则较为复杂,但本质上是一个最短路问题。由于冰球会带来砖块破碎,所以需要用回溯法求解。因此BFS求解最短路尽管效率高,但回溯困难,所以采用了DFS求解。
代码如下
/*
*/
#define method_1
#ifdef method_1
/*
*/
#include
#include
#include
#include
#include
#include
BFS
POJ 3669: Meteor Shower
将所有陨石拓展一格,在所有格子上标注最早毁灭时间。
用三元组(x,y,t)表示状态,即当前位于(x,y)时间为t,bfs时保证t小于所在格子的最早毁灭时间。
如果某个各自的最早毁灭时间为无穷,则当前状态三元组的t即为所求。
本题还有很多实现细节,详见代码注释。
代码如下
/*
*/
#define method_1
#ifdef method_1
/*
将所有陨石拓展一格,在所有格子上标注最早毁灭时间
用三元组(x,y,t)表示状态,即当前位于(x,y)时间为t,bfs时保证t小于所在格子的最早毁灭时间
如果某个各自的最早毁灭时间为无穷,则当前状态三元组的t即为所求。
*/
#include
#include
#include
#include
#include
#include
穷竭搜索
POJ 2718: Smallest Difference
首先,最优解的组合必然是两个位数最接近的数。
即假设有n个数,那么一个是n/2位数,一个是n-n/2位数。
因此暴力dfs枚举第一个集合的选则方式即C(n,n/2)。
然后对于每种情况,先将第一个集合里头的数字全部dfs出来,排序。
再dfs第二个集合里头的所有情况,再在第一个集合里头二分查找比较即可。
对于这个算法,题目有些地方需要特判,详见代码注释。
代码如下
/*
*/
#define method_1
#ifdef method_1
/*
首先,最优解的组合必然是两个位数最接近的数
即假设有n个数 那么一个是n/2位数 一个是n-n/2位数
因此暴力dfs枚举第一个集合的选则方式即C(n,n/2)
然后对于每种情况,先将第一个集合里头的数字全部dfs出来,排序。
再dfs第二个集合里头的所有情况,再在第一个集合里头二分查找比较即可。
*/
#include
#include
#include
#include
#include
#include
POJ 3187: Backward Digit Sums
next_permutation这么快的吗。
看到n<=10就放弃了使用全排列。
想从终态开始搜索然后剪枝。
结果去看题解发现就是枚举初态全排列然后判断即可。理论复杂度是O(n!1010)
没想到竟然能AC。
代码如下
(PS:method_1结果为TLE,method_2注意特判1 1这组数据
/*
next_permutation这么快的吗
看到n<=10就放弃了使用全排列
想从终态开始搜索然后剪枝
结果去看题解发现就是枚举初态全排列然后判断即可 理论复杂度是O(n!*10*10)没想到竟然能AC
*/
#define method_2
#ifdef method_1
/*
从终态开始搜索然后剪枝
TLE
*/
#include
#include
#include
#include
#include
#include
POJ 3050: Hopscotch
爆搜即可,map判重,注意poj上map套string要加头文件 #include。
代码如下
/*
*/
#define method_1
#ifdef method_1
/*
爆搜即可
map判重
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define D(x) cout<<#x<<" = "<pii;
const int maxn=5+5;
const int n=5;
const int INF=0x3f3f3f3f;
const int dx[]={0,0,-1,1};
const int dy[]={1,-1,0,0};
int a[maxn][maxn],ans=0;
mapmp; //poj上map套string要加头文件 #include
bool check(int x,int y){
if(x<1||x>n||y<1||y>n) return false;
return true;
}
void dfs(int x,int y,string s){
s+=char(a[x][y]+'0');
if(s.length()==6){
if(mp[s]==0) mp[s]=++ans;
return;
}
for(int i=0;i<=3;i++){
int newx=x+dx[i],newy=y+dy[i];
if(check(newx,newy)) dfs(newx,newy,s);
}
}
int main() {
ios::sync_with_stdio(false);
//freopen("Hopscotch.in","r",stdin);
for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) cin>>a[i][j];
for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) dfs(i,j,"");
cout<