杭电OJ上看到一个搜索专练,听说Unix考试延期了。。今天上午就做了这上面的搜索题目。。
七题,总的来说就是bfs掌握的不错。。。(dfs第五题就不贴题解了。。。题解都看不懂,。。吃透dfs再做)
dfs还需要加把劲。。
都是水题。。
/*
忘写check函数wa一次
check函数n,m对应关系搞混wa一次。。
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
int y;
int step;
};
node s;
node next;
queue<node>q;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
char map[25][25];
int visit[25][25];
int n,m;
int sx,sy;
int sum;
void getmap()
{
for(int i=0;i<m;i++)
{
cin>>map[i];
for(int j=0;j<n;j++)
{
if(map[i][j]=='@')
{
sx=i;
sy=j;
break;
}
}
}
}
int check(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n)
{
return 1;
}
else
{
return 0;
}
}
void bfs()
{
sum=1;
memset(visit,0,sizeof(visit));
while(!q.empty())
{
q.pop();
}
s.x=sx;
s.y=sy;
s.step=0;
visit[s.x][s.y]=1;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=s.x+dx[i];
next.y=s.y+dy[i];
next.step=s.step+1;
if(map[next.x][next.y]=='.'&&!visit[next.x][next.y]&&check(next.x,next.y))
{
sum++;
q.push(next);
visit[next.x][next.y]=1;
}
}
}
}
int main()
{
while(cin>>n>>m,n!=0&&m!=0)
{
getmap();
bfs();
cout<<sum<<endl;
}
system("pause");
return 0;
}
/*
注意DFS的精髓visit[][]的变化
1A
*/
#include<iostream>
using namespace std;
char map[105][105];
int visit[105][105];
int n,m;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
void getmap()
{
for(int i=0;i<n;i++)
{
cin>>map[i];
}
}
int check(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m)
{
return 1;
}
else
{
return 0;
}
}
void dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int nextx=x+dx[i];
int nexty=y+dy[i];
if(!visit[nextx][nexty]&&check(nextx,nexty)&&map[nextx][nexty]=='#')
{
visit[nextx][nexty]=1;
dfs(nextx,nexty);
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
memset(visit,0,sizeof(visit));
getmap();
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='#'&&!visit[i][j])
{
visit[i][j]=1;
dfs(i,j);
ans++;
}
}
}
cout<<ans<<endl;
}
system("pause");
return 0;
}
/*
dfs+剪枝
对这种深搜题目木有什么思路
题解学习一下。。
*/
#include<iostream>
#include<algorithm>
using namespace std;
int a[25];
int visit[25];
int sum,aver,maxa,n,flag;
void dfs(int edge,int cnt,int k)
{
if(edge==aver)
{
cnt++;
if(cnt==4)
{
flag=1;
return ;
}
else
{
edge=0;
k=0;
}
}
if(flag)
return ;
for(int i=k;i<n;i++)
{
if(!visit[i]&&edge+a[i]<=aver)
{
visit[i]=1;
dfs(edge+a[i],cnt,i);
visit[i]=0;
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
sum=maxa=0;
cin>>n;
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)
{
cin>>a[i];
maxa=max(a[i],maxa);
sum+=a[i];
}
if(sum%4!=0||maxa>sum/4)
{
cout<<"no"<<endl;
}
else
{
flag=0;
aver=sum/4;
dfs(0,0,0);
if(flag)
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
}
}
system("pause");
return 0;
}
/*
还是最不擅长的dfs
注意标记变量保证不重复
参考题解代码,dfs有一点思路了已经
*/
#include<iostream>
using namespace std;
int t,n,flag;
int num[14],save[14];
bool cmp(const int &a,const int &b)
{
return a>b;
}
void dfs(int i,int sum,int count)
{
if(sum>t)
return ;
if(sum==t)
{
for(int j=0;j<count-1;j++)
{
cout<<save[j]<<"+";
}
cout<<save[count-1]<<endl;
flag=1;
return;
}
int tag=-1;
for(int k=i;k<n;k++)
{
if(num[k]!=tag)
{
save[count]=num[k];
sum+=num[k]; //每次的和
tag=num[k]; //保留当前的数,能避免重复
dfs(k+1,sum,count+1);
sum-=num[k];
}
}
}
int main()
{
while(cin>>t>>n&&n!=0)
{
for(int i=0;i<n;i++)
{
cin>>num[i];
}
sort(num,num+n,cmp);
cout<<"Sums of "<<t<<":"<<endl;
dfs(0,0,0);
if(!flag)
{
cout<<"NONE"<<endl;
}
flag=0;
}
return 0;
}
/*
这题wa了一万次。。
visit[]数组开小了。。。。。。。
我把代码改的不成样子了都。。。。
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
int step;
};
int visit[200005];
int start,end;
int check(int x)
{
if(x>=0&&x<=100000)
{
return 1;
}
else
{
return 0;
}
}
void bfs()
{
queue<node>q;
node s;
node next;
s.x=start;
s.step=0;
q.push(s);
visit[s.x]=1;
while(!q.empty())
{
s=q.front();
q.pop();
if(s.x==end)
{
printf("%d\n",s.step);
return ;
}
if(!visit[s.x*2]&&check(s.x*2))
{
next.x=s.x+s.x;
next.step=s.step+1;
visit[next.x]=1;
q.push(next);
}
if(!visit[s.x-1]&&check(s.x-1))
{
next.x=s.x-1;
next.step=s.step+1;
visit[next.x]=1;
q.push(next);
}
if(!visit[s.x+1]&&check(s.x+1))
{
next.x=s.x+1;
next.step=s.step+1;
visit[next.x]=1;
q.push(next);
}
}
}
int main()
{
while(scanf("%d%d",&start,&end)!=EOF)
{
if(end<start)
{
cout<<start-end<<endl;
}
else
{
memset(visit,0,sizeof(visit));
bfs();
}
}
system("pause");
return 0;
}
/*
木有什么难度。。
visit[][]标记是否走过,当遇到visit[][]=1时说明进入循环
另外开一个record[][]数组标记每个状态的步数
*/
#include<iostream>
#include<cstdio>
using namespace std;
char map[15][15];
int visit[15][15];
int record[15][15];
int n,m,k,cnt;
void dfs(int x,int y)
{
if(x<0||x>=n||y<0||y>=m||visit[x][y]==1)
{
if(visit[x][y]==1)
{
printf("%d step(s) before a loop of %d step(s)\n",record[x][y]-1,cnt-record[x][y]+1);
}
else
{
printf("%d step(s) to exit\n",cnt);
}
return ;
}
visit[x][y]=1;
cnt++;
record[x][y]=cnt;
if(map[x][y]=='E')
{
dfs(x,y+1);
}
if(map[x][y]=='W')
{
dfs(x,y-1);
}
if(map[x][y]=='N')
{
dfs(x-1,y);
}
if(map[x][y]=='S')
{
dfs(x+1,y);
}
}
int main()
{
while(cin>>n>>m>>k&&n+m+k!=0)
{
cnt=0;
for(int i=0;i<n;i++)
{
cin>>map[i];
}
memset(visit,0,sizeof(visit));
memset(record,0,sizeof(record));
dfs(0,k-1);
}
system("pause");
return 0;
}
下午博雅课。。好困。。
还要看物理实验。。
又A了几题。。搜索就做到现在吧。。。
虽然一遇到搜索总是先写bfs...dfs几乎不会。。。
/*
题没什么好说的就是dfs+枚举。。
嫌太麻烦了抄了代码。。。
我有罪
*/
#include<iostream>
#include<cstring>
using namespace std;
int a[10],b[10];
int mark[10];
int flag;
int judge(int num,int n)
{
if(n==1&&num==2)
return 1;
if(n==8&&num==7)
return 1;
if((n>1&&n<8)&&(num==(n-1)||num==(n+1)))
return 1;
return 0;
}
int check(int pos ,int n)
{
int i;
if(pos==1)
{
for(i=2;i<=4;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==2)
{
if(judge(a[1],n)) return 0;
if(judge(a[3],n)) return 0;
if(judge(a[5],n)) return 0;
if(judge(a[6],n)) return 0;
return 1;
}
if(pos==3)
{
if(judge(a[1],n)) return 0;
if(judge(a[2],n)) return 0;
for(i=4;i<=7;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==4)
{
if(judge(a[1],n)) return 0;
if(judge(a[3],n)) return 0;
for(i=6;i<=7;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==5)
{
if(judge(a[2],n)) return 0;
if(judge(a[3],n)) return 0;
if(judge(a[6],n)) return 0;
if(judge(a[8],n)) return 0;
return 1;
}
if(pos==6)
{
for(i=2;i<=5;i++)
if(judge(a[i],n)) return 0;
return 1;
for(i=7;i<=8;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==7)
{
if(judge(a[3],n)) return 0;
if(judge(a[4],n)) return 0;
if(judge(a[6],n)) return 0;
if(judge(a[8],n)) return 0;
return 1;
}
if(pos==8)
{
for(i=5;i<=6;i++)
if(judge(a[i],n)) return 0;
return 1;
}
}
void DFS(int pos)
{
int i;
if(pos>8)
{
flag++;
for(i=1;i<=8;i++)
b[i]=a[i];
return ;
}
if(a[pos]==0)
{
for( i=1;i<=8;i++)
{
if(!mark[i]&&check(pos,i))
{
mark[i]=1;
a[pos]=i;
DFS(pos+1);
mark[i]=0;
a[pos]=0;
}
}
}
else
DFS(pos+1);
}
int main()
{
int t,i,j;
cin>>t;
for(j=1;j<=t;j++)
{
memset(mark,0,sizeof(mark));
for(i=1;i<=8;i++)
{
cin>>a[i];
mark[a[i]]=1;
}
flag=0;
DFS(1);
if(!flag)
{
printf("Case %d: ",j);
printf("No answer\n");
}
else if(flag>1)
{
printf("Case %d: ",j);
printf("Not unique\n");
}
else
{
printf("Case %d: ",j);
printf("%d",b[1]);
for(i=2;i<=8;i++)
printf(" %d",b[i]);
printf("\n");
}
}
return 0;
}
/*
c++过了
GNC C++没有过。。
简单的bfs..
*/
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
struct node
{
int x;
int y;
int z;
int step;
};
node s;
node next;
queue<node>q;
int dx[6]={1,0,-1,0,0,0};
int dy[6]={0,-1,0,1,0,0};
int dz[6]={0,0,0,0,1,-1};
int map[50][50][50];
int visit[50][50][50];
int sx,sy,sz,ex,ey,ez;
int A,B,C,T;
int check(int x,int y,int z)
{
if(x>=0&&x<A&&y>=0&&y<B&&z>=0&&z<C&&map[x][y][z]==0)
{
return 1;
}
else
{
return 0;
}
}
void bfs()
{
for(int i=0;i<A;i++)
{
for(int j=0;j<B;j++)
{
for(int l=0;l<C;l++)
{
visit[i][j][l]=0;
}
}
}
s.x=sx;
s.y=sy;
s.z=sz;
s.step=0;
q.push(s);
visit[s.x][s.y][s.z]=1;
while(!q.empty())
{
s=q.front();
q.pop();
if(s.x==ex&&s.y==ey&&s.z==ez)
{
if(s.step<=T)
printf("%d\n",s.step);
else
printf("-1\n");
return ;
}
for(int i=0;i<6;i++)
{
next.x=s.x+dx[i];
next.y=s.y+dy[i];
next.z=s.z+dz[i];
next.step=s.step+1;
if(check(next.x,next.y,next.z)&&!visit[next.x][next.y][next.z])
{
q.push(next);
visit[next.x][next.y][next.z]=1;
}
}
}
printf("-1\n");
}
int main()
{
int k;
scanf("%d",&k);
while(k--)
{
// memset(map,1,sizeof(map));
scanf("%d%d%d%d",&A,&B,&C,&T);
for(int i=0;i<A;i++)
{
for(int j=0;j<B;j++)
{
for(int l=0;l<C;l++)
{
scanf("%d",&map[i][j][l]);
}
}
}
sx=0;
sy=0;
sz=0;
ex=A-1;
ey=B-1;
ez=C-1;
bfs();
}
system("pause");
return 0;
}
/*
额。
bfs模版敲的越来越熟练了。。
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
int y;
int step;
};
node s;
node next;
queue<node>q;
int dx[8]={2,1,-1,-2,-2,-1,1,2};
int dy[8]={1,2,2,1,-1,-2,-2,-1};
int map[9][9];
int visit[9][9];
int sx,sy,ex,ey;
char s1[5],s2[5];
int check(int x,int y)
{
if(x>=0&&x<8&&y>=0&&y<8)
{
return 1;
}
else
{
return 0;
}
}
void bfs()
{
memset(visit,0,sizeof(visit));
while(!q.empty())
{
q.pop();
}
s.x=sx;
s.y=sy;
s.step=0;
q.push(s);
visit[s.x][s.y]=1;
while(!q.empty())
{
s=q.front();
q.pop();
if(s.x==ex&&s.y==ey)
{
cout<<"To get from "<<s1<<" to "<<s2<<" takes "<<s.step<<" knight moves."<<endl;
return ;
}
for(int i=0;i<8;i++)
{
next.x=s.x+dx[i];
next.y=s.y+dy[i];
next.step=s.step+1;
if(!visit[next.x][next.y]&&check(next.x,next.y))
{
q.push(next);
visit[next.x][next.y]=1;
}
}
}
}
int main()
{
while(cin>>s1>>s2)
{
sx=s1[0]-'a';
sy=s1[1]-'1';
ex=s2[0]-'a';
ey=s2[1]-'1';
bfs();
}
system("pause");
return 0;
}
/*
还是bfs
只不过状态之间的转换变了
网上搜的代码
*/
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
int bucket[3];
int step;
};
bool matrix[101][101][101];
int bfs(int a,int b,int c)
{
int half,st[3],i,j;;
node cur,temp;
memset(matrix,0,sizeof(matrix));
queue<node>que;
st[0]=a,st[1]=b,st[2]=c;
half=a>>1;
cur.bucket[0]=st[0],cur.bucket[1]=0,cur.bucket[2]=0,cur.step=0;
matrix[a][0][0]=1;
que.push(cur);
while(!que.empty())
{
cur=que.front(),que.pop();
if((cur.bucket[0]==half&&cur.bucket[1]==half)||(cur.bucket[1]==half&&cur.bucket[2]==half)||(cur.bucket[2]==half&&cur.bucket[0]==half))
{
return cur.step;
}
cur.step++;
for(i=0; i<3; i++)
{
if(cur.bucket[i]>0)
for(j=0; j<3; j++)
{
temp=cur;
if(i==j)continue;
if(temp.bucket[i]<=st[j]-temp.bucket[j])
{
temp.bucket[j]+=temp.bucket[i];
temp.bucket[i]=0;
}
else
{
temp.bucket[i]-=st[j]-temp.bucket[j];
temp.bucket[j]=st[j];
}
if(!matrix[temp.bucket[0]][temp.bucket[1]][temp.bucket[2]])
{
matrix[temp.bucket[0]][temp.bucket[1]][temp.bucket[2]]=1;
que.push(temp);
}
}
}
}
return 0;
}
int main()
{
int a,b,c,ans;
while(cin>>a>>b>>c,a||b||c)
{
if(a%2)
{
cout<<"NO"<<endl;
continue;
}
ans=bfs(a,b,c);
if(ans==0)cout<<"NO"<<endl;
else cout<<ans<<endl;
}
return 0;
}
/*
简单dfs
用isprime[]数组事先标记是否为素数
*/
#include<iostream>
using namespace std;
int n,ans[21],isprime[]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0},visit[21];
void dfs(int step)
{
int i;
if(step==n+1)
{
if(isprime[ans[n]+1])
{
for(i=1;i<=n-1;i++)
{
cout<<ans[i]<<" ";
}
cout<<ans[i]<<endl;
}
}
else
{
for(i=2;i<=n;i++)
{
if(!visit[i]&&isprime[i+ans[step-1]])
{
ans[step]=i;
visit[i]=1;
dfs(step+1);
visit[i]=0;
}
}
}
}
int main()
{
int tt;
tt=0;
while(cin>>n)
{
tt++;
ans[1]=1;
memset(visit,0,sizeof(visit));
cout<<"Case "<<tt<<":"<<endl;
dfs(2);
cout<<endl;
}
}
/*
变形bfs
用map[i][j]表示i+'a'开头j+'a'结尾的单词
然后就是bfs模版了
*/
#include <iostream>
#include <queue>
using namespace std;
int visit[10005];
int map[55][55];
char str[10005];
queue<int>q;
int s;
int next;
void bfs()
{
memset(visit,0,sizeof(visit));
while(!q.empty())
{
q.pop();
}
s='b'-'a';
q.push(s);
visit[s]=1;
while(!q.empty())
{
s=q.front();
q.pop();
if(s=='m'-'a')
{
cout<<"Yes."<<endl;
return;
}
for(int i=0;i<26;i++)
{
next=i;
if(!visit[next]&&map[s][next]==1)
{
q.push(next);
visit[next]=1;
}
}
}
cout<<"No."<<endl;
}
int main()
{
memset(map,0, sizeof(map));
while(cin>>str)
{
int l=strlen(str);
map[str[0]-'a'][str[l-1]-'a']=1;
if(str[0]=='0')
{
bfs();
memset(map,0,sizeof(map));
}
}
return 0;
}
/*
三维bfs
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
int y;
int z;
int step;
};
node s;
node next;
queue<node>q;
int dx[6]={1,0,-1,0,0,0};
int dy[6]={0,1,0,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
char map[11][11][11];
int n;
int sx,sy,sz,ex,ey,ez;
int visit[11][11][11];
int check(int x,int y,int z)
{
if(x>=0&&x<n&&y>=0&&y<n&&z>=0&&z<n)
{
return 1;
}
else
{
return 0;
}
}
void bfs()
{
memset(visit,0,sizeof(visit));
while(!q.empty())
{
q.pop();
}
s.x=sx;
s.y=sy;
s.z=sz;
s.step=0;
visit[s.x][s.y][s.z]=1;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
if(s.x==ex&&s.y==ey&&s.z==ez)
{
printf("%d %d\n",n,s.step);
return ;
}
for(int i=0;i<6;i++)
{
next.x=s.x+dx[i];
next.y=s.y+dy[i];
next.z=s.z+dz[i];
next.step=s.step+1;
if(!visit[next.x][next.y][next.z]&&check(next.x,next.y,next.z)&&map[next.x][next.y][next.z]=='O')
{
visit[next.x][next.y][next.z]=1;
q.push(next);
}
}
}
printf("NO ROUTE\n");
}
int main()
{
char s1[10],s2[10];
char temp[10];
while(scanf("%s%s",s1,s2)!=EOF)
{
n=s2[0]-'0';
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<n;j++)
{
scanf("%c",&map[i][j][k]);
}
}
}
scanf("%d%d%d",&sx,&sy,&sz);
scanf("%d%d%d",&ex,&ey,&ez);
scanf("%s",temp);
bfs();
}
system("pause");
return 0;
}
/*
二维背包。。还没学到。。以后再说
用dfs写超时。。
*/
#include<iostream>
#define N 25
using namespace std;
int v[N],w[N],visit[N];
int n,m;
int W;
int sum;
void dfs(int value,int weight,int num,int index)
{
if(num==m||value==n)
{
if(sum<weight)
{
sum=weight;
}
return ;
}
for(int i=index;i<n;i++)
{
if(!visit[i]&&num+1<=m&&weight+w[i]<=W)
{
visit[i]=1;
dfs(value+v[i],weight+w[i],num+1,index+1);
visit[i]=0;
}
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
visit[i]=0;
cin>>v[i]>>w[i];
}
scanf("%d",&W);
sum=0;
dfs(0,0,0,0);
printf("%d\n",sum);
}
system("pause");
return 0;
}
/*
dfs
从每一个@出发,count+1,dfs其八个方向,遇到@即将它置为*
*/
#include<iostream>
#define N 105
using namespace std;
int m,n;
char map[N][N];
int dx[8]={1,1,0,-1,-1,-1,0,1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
bool check(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n)
{
return true;
}
else
{
return false;
}
}
void dfs(int sx,int sy)
{
map[sx][sy]='*';
int x,y;
for(int i=0;i<8;i++)
{
x=sx+dx[i];
y=sy+dy[i];
if(check(x,y)&&map[x][y]=='@')
{
dfs(x,y);
}
}
}
int main()
{
while(cin>>m>>n,m!=0&&n!=0)
{
int count=0;
for(int i=0;i<m;i++)
{
cin>>map[i];
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='@')
{
count++;
dfs(i,j);
}
}
}
cout<<count<<endl;
}
system("pause");
return 0;
}
/*
bfs~
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x;
int step;
};
node s;
node next;
queue<node>q;
int start,end;
int map[205];
int visit[205];
int n;
int dx[2]={1,-1};
int check(int x)
{
if(x>=1&&x<=n)
{
return 1;
}
else
{
return 0;
}
}
void bfs()
{
memset(visit,0,sizeof(visit));
while(!q.empty())
{
q.pop();
}
s.x=start;
s.step=0;
visit[s.x]=1;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
if(s.x==end)
{
cout<<s.step<<endl;
return ;
}
for(int i=0;i<2;i++)
{
next.x=s.x+dx[i]*map[s.x];;
next.step=s.step+1;
if(check(next.x)&&!visit[next.x])
{
q.push(next);
visit[next.x]=1;
}
}
}
cout<<"-1"<<endl;
}
int main()
{
while(cin>>n&&n!=0)
{
cin>>start>>end;
for(int i=1;i<=n;i++)
{
cin>>map[i];
}
bfs();
}
system("pasue");
return 0;
}
2577

被折叠的 条评论
为什么被折叠?



