bfs图的遍历:
#include<iostream>
#include<queue>
using namespace std;
const int maxN = 10;//最大个数
int n,m; //n点的个数 m边的个数
bool vis[maxN]; //默认为false
vector<int> G[maxN];
queue<int> q;
void bfs(int t){
vis[t]=true;//起点放入
q.push(t);
while(!q.empty()){
int x = q.front(); //取出
q.pop(); //弹出
cout<<x<<" ";
for(int i = 0; i<G[x].size(); i++){
if(!vis[ G[x][i] ]){
q.push(G[x][i]);
vis[G[x][i]] =true;
}
}
}
}
int main(){
int x,y;
cin>>n>>m;
for(int i = 0;i<m;i++){
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);//有向图的话不能有这句
}
bfs(0);
cout<<endl;
return 0;
}
/*
7 8
0 2
0 4
0 5
1 5
2 3
2 4
3 6
4 5
*/
#include<iostream>
#include<algorithm>
using namespace std;
long long ans=0;
long long n,k;
const long long maxN = 1e9+7;
void dfs(long long num,int dig){
if(dig==n){
if(num%k==0) ans+=1;
return;
}
for(int j = 1;j <= 6;j++){
dfs(num*10 + j,dig+1);
}
}
int main(){
cin>>n>>k;
for(int i = 1;i <=6;i++){
dfs(i,1);
}
ans = ans % maxN;
cout<<ans;
return 0;
}
马的遍历bdfs
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,sx,sy;
int a[500][500];
int dx[8] = {1,1,-1,-1,2,2,-2,-2};
int dy[8] = {2,-2,2,-2,1,-1,1,-1};
void dfs(int x,int y,int step){
a[x][y] = step;
if(step>400) return;
for(int i = 0;i < 8;i++){
int xx = dx[i] + x;
int yy = dy[i] + y;
if(xx>0&&yy>0&&xx<=n&&yy<=m){
if(a[xx][yy] == -1 || a[xx][yy] > step + 1){
dfs(xx,yy,step + 1);
}
}
}
}
int main()
{
memset(a,-1,sizeof(a));
cin>>n>>m;
cin>>sx>>sy;
dfs(sx,sy,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%-5d",a[i][j]);
cout<<endl;
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
int a[500][500];
int sx,sy;
int dx[8] = {1,1,-1,-1,2,2,-2,-2};
int dy[8] = {2,-2,2,-2,1,-1,1,-1};
struct Point{
int x;
int y;
int step;
};
queue<Point> q;
void bfs()
{
Point p;
p.x = sx;
p.y = sy;
p.step =0;
q.push(p);
a[sx][sy]= 0;
while(!q.empty()){
Point P = q.front(),newP;
q.pop();
for(int i = 0;i < 8 ;i++){
int xx = P.x + dx[i];
int yy = P.y + dy[i];
if(xx>0&&yy>0&&xx<= n&&yy<=m&&a[xx][yy]==-1){
a[xx][yy] = P.step+1;
newP.step = a[xx][yy];
newP.x = xx;
newP.y = yy;
q.push(newP);
}
}
}
}
int main()
{
memset(a,-1,sizeof(a));
cin>>n>>m;
cin>>sx>>sy;
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%-5d",a[i][j]);
cout<<endl;
}
return 0;
}
图的遍历 洛谷P3916
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int maxN = 1e5+5;//根据需要改
int n,m; //n点的个数 m边的个数
int cnt = 0; //记录已经访问过的
vector<int> G[maxN];
int maxC[maxN];
void dfs(int x,int max){
if(maxC[x] == 0){
cnt++;
maxC[x] = max;
}
if(cnt==n) return; // 遍历完所有点,退出
for(int i =0;i < G[x].size();i++){//G[x]为一个数组
if(maxC[ G[x][i] ] == 0){
dfs(G[x][i],max);
}
}
}
int main(){
int x,y;
cin>>n>>m;
for(int i = 0;i<m;i++){
cin>>x>>y;
G[y].push_back(x);
}
for(int i = n;i > 0;i--) dfs(i,i);
for(int i = 1;i <= n;i++) cout<<maxC[i]<<" ";
return 0;
}
/*
7 8
0 2
0 4
0 5
1 5
2 3
2 4
3 6
4 5
*/
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
char c[10][10];
bool vis[10];
int n,k;
LL cnt = 0,sum = 0;
void dfs(int x){
if(cnt==k) {
sum++;
return;
}
if(x>n) return;
for(int i = 1; i<=n;i++){
if(!vis[i]&&c[x][i]=='#'){
vis[i] = true;
cnt++;
dfs(x+1);
vis[i] = false;
cnt--;
}
}
dfs(x+1);
}
int main(){
char s[15];
while(true){
sum=0;
cin>>n>>k;
if(n==-1&&k==-1) break;
for(int i = 1; i<= n;i++){
cin>>s;
for(int j = 1; j<= n;j++){
c[i][j] = s [j - 1];
}
}
dfs(1);
cout<<sum<<endl;
}
return 0;
}