2016春季练习——dfs爆搜
2016-03-24 09:41
204 查看
来源:HDU1045
这个题目因为图极小,所以原来可以很快的过的,但是我当时用了一个错误的方法,做了好久还是WA
先看我的代码:
这个题目因为图极小,所以原来可以很快的过的,但是我当时用了一个错误的方法,做了好久还是WA
先看我的代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <stack> using namespace std; int n,ans; int sum; char mp[5][5]; bool vis[5][5]; struct Node{ int x,y; }; stack<queue<Node> >sp;//我考虑删去vis数组的时候有可能的误删情况,其实这一题根本不需要刷vis数组,直接判断可不可以放就行了 void ini(){ memset(vis,false,sizeof(vis)); memset(mp,0,sizeof(mp)); while(!sp.empty())sp.pop(); ans=0; sum=0; } bool judge(int x,int y){ if(x<0||y<0||x>n||y>n||vis[x][y]) return 0; return 1; } int xx,yy; bool lookfor(){ for(int i=n-1;i>=0;i--) for(int j=n-1;j>=0;j--) if(!vis[i][j]){ xx=i; yy=j; return 1; } return 0; } void shua(int x,int y){ int i; vis[x][y]=true; queue<Node>q; if(1+x<n){ for(i=x+1;i<n;i++) { if(mp[i][y]=='.') { if(vis[i][y]==true){ Node p; p.x=i; p.y=y; q.push(p); } else vis[i][y]=true; } else break; } } if(x-1>=0){ for(i=x-1;i>=0;i--) { if(mp[i][y]=='.') { if(vis[i][y]==true){ Node p; p.x=i; p.y=y; q.push(p); } else vis[i][y]=true; } else break; } } if(1+y<n){ for(i=y+1;i<n;i++) { if(mp[x][i]=='.') { vis[x][i]=true; } else break; } } if(x-1>=0){ for(i=x-1;i>=0;i--) { if(mp[x][i]=='.') { if(vis[x][i]==true){ Node p; p.x=x; p.y=i; q.push(p); } else vis[x][i]=true; } else break; } } sp.push(q); } void hui(int x,int y){ int i; vis[x][y]=false; queue<Node>q; q=sp.top(); sp.pop(); if(1+x<n){ Node p; p=q.front(); for(i=x+1;i<n;i++) { if(p.x==i&&p.y==y){ q.pop(); p=q.front(); continue; } else{ if(mp[i][y]=='.'){ vis[i][y]=false; } else break; } } } if(x-1>=0){ Node p; p=q.front(); for(i=x-1;i>=0;i--) { if(p.x==i&&p.y==y){ q.pop(); p=q.front(); continue; } else{ if(mp[i][y]=='.'){ vis[i][y]=false; } else break; } } } if(1+y<n){ Node p; p=q.front(); for(i=y+1;i<n;i++) { if(p.x==x&&p.y==i){ q.pop(); p=q.front(); continue; } else{ if(mp[x][i]=='.'){ vis[x][i]=false; } else break; } } } if(x-1>=0){ Node p; p=q.front(); for(i=x-1;i>=0;i--) { if(p.x==x&&p.y==i){ q.pop(); p=q.front(); continue; } else{ if(mp[x][i]=='.'){ vis[x][i]=false; } else break; } } } } void dfs(int cnt){//一看就是搜索还不得要领,要多多努力啊 if(lookfor()==0){ ans=max(ans,cnt); return ; } else { int x=xx; int y=yy; shua(x,y); dfs(cnt+1); hui(x,y); } } int main(){ while(scanf("%d",&n)!=EOF&&n){ ini(); for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { cin>>mp[i][j]; if(mp[i][j]=='X') vis[i][j]=true; else sum++; } } dfs(0); printf("%d\n",ans); } return 0; }然后看了一下题解,终于知道可以直接判断啊,瞬间懵懂了.
#include <iostream> #include <cstdio> using namespace std; int n; int mp[10][10]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//搜索方向 int cnt,k;//结果 struct Node{ int x,y; }p[20]; int judge(int x,int y){//判断边界,好理解 if(x<0||y<0||x>=n||y>=n)return -1; return mp[x][y]; } int shua(int k){//判断是否可走的函数,k表示第k个还可以放置的点 int flag=0; int xx,yy; for(int i=0;i<4;i++){ if(flag)break; xx=p[k].x+dir[i][0]; yy=p[k].y+dir[i][1]; while(xx>=0&&yy>=0&&xx<n&&yy<n){ if(judge(xx,yy)==-1)break; if(judge(xx,yy)==1){//1就是说我走到了一个mp[i][j]已经放东西了 flag=-1; break;//此时可以换方向了,一个方向刷完了 } xx+=dir[i][0];//不然,继续这个方向 yy+=dir[i][1]; } } return flag;//返回我判断的情况 } void dfs(int x,int curse){ int i,j; cnt=max(cnt,curse);//比较存下结果 if(x==k)return ;//不可能还有地方的时候 dfs(x+1,curse);//找下一个点,如果返回 if(!shua(x)){ mp[p[x].x][p[x].y]=1;//占下这个点 dfs(x+1,curse+1);//返回,要么不能放,要么已经改变cnt mp[p[x].x][p[x].y]=0;//去掉这个点 }
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
int main(){ while(scanf("%d",&n)!=EOF&&n){ int i,j; char c; k=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ cin>>c; if(c=='.'){ mp[i][j]=0;//存图 p[k].x=i; p[k].y=j; k++;//记录空地的个数和位置 } else mp[i][j]=-1; } } cnt=0; dfs(0,0); cout<<cnt<<endl; } return 0; }
相关文章推荐
- 224y
- 225y
- c++第二次上机实验项目二
- c++实验2-标准体重
- C++上机实验2-1标准体重
- Codeforces 549F Yura and Developers
- ASP.NET-缓存outputcache参数
- 分享一个自定义的 console 类,让你不再纠结JS中的调试代码的兼容
- string.xml的用法总结
- iOS 本地推送、远程推送及带快速回复的本地推送
- 管道的三种使用方案中,唯一正确而安全的使用方法
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- c++实验2——标准体重
- jquery $.fn $.fx是什么意思有什么用
- HOG+SVM行人检测博客资料汇总
- runtime 的浅解
- log4j分析
- 把一个win32控制台项目转变为一个win32项目
- Java学习笔记(二)之―Java基础, Java平台版本, JDK环境搭建
- Meta标签中的apple-mobile-web-app-capable属性及含义