• C++
  • 深度优先搜索和广度优先搜索

  • @ 2024-8-25 15:00:43

image image

image image image image image image

八皇后问题

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int q[10][10],dl[15],dr[15],l[10],s=0;

void dfs(int h){//h代表我现在调用dfs找第h行的皇后
	if(h>8){
		s++;
		cout<<"No. "<<s<<endl;
		for(int i=1;i<=8;i++){
			for(int j=1;j<=8;j++){
				cout<<q[j][i]<<" ";
			}
			cout<<endl;
		}
		return;
	}
	for(int i=1;i<=8;i++){
		if(l[i]==0&&dl[h-i+7]==0&&dr[h+i]==0){
			q[h][i]=1;// 在第h行第i列摆上一个皇后
			l[i]=1; // 把第i列设置为被占领状态
			dl[h-i+7]=1; // 把此皇后所在的左对角线设置为占领状态
			dr[h+i]=1; // 把此皇后所在的右对角线设置为占领状态
			dfs(h+1); // 调用自己去摆下一行的皇后
			q[h][i]=0; // 回溯,把这一列的摆上的皇后撤回
			l[i]=0; // 释放占领的列
			dl[h-i+7]=0; // 释放占领的左对角线
			dr[h+i]=0; // 释放占领的左对角线
		}
	}
}

int main(){
	dfs(1);
	return 0;
}

image

深搜 image image

广搜 image image image

1 条评论

  • @ 2024-8-25 17:55:22

    image image

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e5+10;
    int n,m,a[110][110],max_ans,c[110],d[110];
    
    bool chick_i(int x){
    	int flag=0;
    	for(int i=1;i<=n;i++){
    		if(c[i]==1){
    			if(a[x][i]==1){
    				flag =1;
    			}
    		}
    	}
    	if(flag==0)return true;
    	else return false;
    }
    
    
    int dfs(int t){
    	if(t-1>max_ans){
    		max_ans=t-1;
    		for(int i=1;i<=n;i++){
    			d[i]=c[i];
    		}
    	}
    	for(int i=1;i<=n;i++){
    		if(c[i]==0){
    			if(chick_i(i)){
    				c[i]=1;
    				dfs(t+1);
    				c[i]=0;
    			}
    		}
    	}
    	return 0;
    }
    
    int main(){
    	cin>>n>>m;
    	for(int i=1;i<=m;i++){
    		int a1,a2;
    		cin>>a1>>a2;
    		a[a1][a2]=1;
    		a[a2][a1]=1;
    	}
    	dfs(1);
    	cout<<max_ans;
    	for(int i=1;i<=n;i++){
    		cout<<d[i]<<" ";
    	}
    	return 0;
    }
    
    • 1