1 条题解

  • 2
    @ 2022-11-12 16:53:53

    超时版本

    #include<bits/stdc++.h>
    using namespace std;
    int ans[10];//ans[1]~ans[8] (1,ans[1])/(2,ans[2])/...
    int tot = 0;
    void dfs(int now){
    	if(now==9){
    		bool flag=true;
    		for(int i=1;i<=8;i++)
    			for(int j=i+1;j<=8;j++)
    				//比较 (i,ans[i]) 和 (j,ans[j]) 是否冲突 
    				if(ans[i]==ans[j]||
    				   i+ans[i]==j+ans[j]||
    				   i-ans[i]==j-ans[j])
    					flag=false;
    		if(flag){
    			tot++;
    			cout<<"No. "<<tot<<"\n";
    			for(int i=1;i<=8;i++){
    				for(int j=1;j<=8;j++)
    					if(ans[j]==i)
    						cout<<1<<" ";
    					else
    						cout<<0<<" ";
    				cout<<"\n";
    			}
    		}
    		return;
    	}
    	for(int i=1;i<=8;i++){
    		//(now,i)
    		ans[now]=i;
    		dfs(now+1);
    	}
    }
    int main()
    {
    	dfs(1);
    	return 0;
    }
    

    不超时版本

    #include<bits/stdc++.h>
    using namespace std;
    int ans[10];//ans[1]~ans[8] (1,ans[1])/(2,ans[2])/...
    int tot = 0;
    void dfs(int now){
    	if(now==9){
    		tot++;
    		cout<<"No. "<<tot<<"\n";
    		for(int i=1;i<=8;i++){
    			for(int j=1;j<=8;j++)
    				if(ans[j]==i)
    					cout<<1<<" ";
    				else
    					cout<<0<<" ";
    			cout<<"\n";
    		}
    		return;
    	}
    	for(int i=1;i<=8;i++){
    		//尝试选择(now,i)
    		bool flag=true;//一开始认为可以选择
    		for(int j=1;j<=now-1;j++){
    			//(j,ans[j])
    			if(i==ans[j]||
    			   now+i==j+ans[j]||
    			   now-i==j-ans[j])
    			{
    				flag=false;
    				break;
    			}
    		} 
    		if(flag){
    			ans[now]=i;
    			dfs(now+1);
    		}
    	}
    }
    int main()
    {
    	dfs(1);
    	return 0;
    }
    
    • 1

    信息

    ID
    433
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    (无)
    递交数
    97
    已通过
    33
    上传者