今天就看了搜索,图论根本不知道,搜索分为广搜bfs和深搜dfs,求最小步数涉及到最小时用的比较多,广搜是一层层的来,从初始状态开始,利用规则生成下一层,检查是否出现目标状态,用queue实现,取出(front)队头元素,删除(pop)队头元素,压入(push),直到找到目标状态(有解)或队列为空(无解),深搜时一条路走到黑,看是否符合目标状态,不符合回溯,有的需要回溯,有的不需要。
bfs:catch the cow
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int inf=200005;
int v[inf],cnt;
void bfs(int n,int k)
{
queue<int>q;
q.push(n);//位置
q.push(cnt);//步数
v[n]=1;//是否遍历
while(!q.empty())
{
n=q.front();
q.pop();
cnt=q.front();
q.pop();
if(n==k)//目标状态
return;
if(n-1>0&&!v[n-1])//规则
{
q.push(n-1);
q.push(cnt+1);
v[n-1]=1;
}
if(n+1<inf&&!v[n+1])
{
q.push(n+1);
q.push(cnt+1);
v[n+1]=1;
}
if(2*n<inf&&!v[2*n])
{
q.push(2*n);
q.push(cnt+1);
v[2*n]=1;
}
}
}
int main()
{
int n,k;
while(cin>>n>>k)
{
memset(v,0,sizeof(v));
cnt=0;
if(n>k)
cout<<n-k<<endl;
else
{
bfs(n,k);
cout<<cnt<<endl;
}
}
}
dfs a knight's journey
#include<bits/stdc++.h>
using namespace std;
int v[27][27],p,q,flag;
//int dy[8]={2,2,1,-1,-2,-2,-1,1};
//int dx[8]={1,-1,-2,-2,-1,1,2,2};
int dx[8]={-1,1,-2,2,-2,2,-1,1};//由于按字典序(lexicographically)输出,所以在方向的时候不是随意写,按字典序走,dx就是表示行
int dy[8]={-2,-2,-1,-1,1,1,2,2};
//int dy[8]={-1,1,-2,2,-2,2,-1,1};
//int dx[8]={-2,-2,-1,-1,1,1,2,2};
int path1[26*26];
char path2[26*26];
bool island(int a,int b)
{
if(a<0||a>=p||b<0||b>=q)//判断是否越界
return true;
return false;
}
void dfs(int x,int y,int num)//num步数
{
path1[num]=x;path2[num]=y+'A';
v[x][y]=1;
if(num==p*q)
{
flag=1;
return;
}
for(int i=0;i<8;i++)
{
if(island(x+dx[i],y+dy[i])) continue;
if(v[x+dx[i]][y+dy[i]]) continue;
v[x+dx[i]][y+dy[i]]=1;
dfs(x+dx[i],y+dy[i],num+1);
if(flag) return;
else v[x+dx[i]][y+dy[i]]=0;//回溯
}
}
int main()
{
int t,i,j,k;
cin>>t;
for(i=1;i<=t;i++)
{
cin>>p>>q;
flag=0;
memset(v,0,sizeof(v));
/*for(k=0;k<p;k++)
{
for(j=0;j<q;j++)
{
dfs(k,j,1);
if(flag) break;
}
if(flag) break;;
}*/字典序说以从左上角开始
dfs(0,0,1);
cout<<"Scenario #"<<i<<":"<<endl;
if(flag)
{
for(j=1;j<=p*q;j++)
{
cout<<path2[j]<<path1[j]+1;
}
cout<<endl<<endl;
}
else
cout<<"impossible"<<endl<<endl;
}
}
dfs find the multiple
#include<bits/stdc++.h>
using namespace std;
int n,flag;
void dfs(long long a,int dep)
{
if(flag) return;//保证输出一个
if(a%n==0)
{
cout<<a<<endl;
flag=1;
}
if(dep==19) return;//本来没写,如超出longlong范围就会出随机数
dfs(a*10,dep+1);
dfs(a*10+1,dep+1);
}
int main()
{
while(cin>>n)
{
if(n==0) break;
//cout<<dfs(1,1)<<endl;
flag=0;
dfs(1,1);
//cout<<b<<endl;
}
}