1 solutions

  • 0
    @ 2024-12-11 0:16:56

    C++ :

    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <cstring>
    #include <iomanip>
    #include<iostream>
    int nhuanghou(int x);
    int aprint();
    using namespace std;
    int n;
    int sum=0;
    int answer[20]={0};
    bool ys_zx[20]={false};
    bool zs_ys[20]={false};
    bool lie[20]={false};
    int main()
    {
    	cin>>n;
    	nhuanghou(1);
    	if(sum==0)
    	cout<<"no solute!"<<endl;
    }
    int nhuanghou(int x)
    { 
    	for(int y=1;y<=n;y++)
    	{
    		if(ys_zx[x+y]==false&&zs_ys[x-y+8]==false&&lie[y]==false)
    		{
    			ys_zx[x+y]=true;
    			zs_ys[x-y+8]=true;
    			lie[y]=true;
    			answer[x]=y;
    			if(x==n)
    			{
    				sum++;
    				aprint();
    			}
    			else
    			nhuanghou(x+1);
    			ys_zx[x+y]=false;
    			zs_ys[x-y+8]=false;
    			lie[y]=false;
    			answer[x]=0;
    		}
    		}
    }
    int aprint()
    { 
    	for(int i=1;i<=n;i++)
    	cout<<setw(5)<<answer[i];
    	cout<<endl;
    }
    

    Pascal :

    program queen;
    const maxlen=100;
    var
    a:array[1..maxlen]of longint;//记录皇后的行坐标
    b,c,d:array[-maxlen+1..2*maxlen]of longint;//行,右上,右下斜线的占位标志
    m,n:longint;
    procedure queen(j:longint);
    var
    i:longint;
    begin
        if j>n then
        begin
            for i:=1 to n do write(a[i]:5);//满足条件,找到一种方案
            writeln;
            exit;
        end;
        for i:=1 to n do//每个皇后位置有八种可能
            if(b[i]=0)and(c[i+j]=0)and(d[j-i]=0)then//如果位置没有被占则运行
            begin
                a[j]:=i;//皇后放置在此行
                b[i]:=1;//占领第i行
                c[i+j]:=1;//占领右上
                d[j-i]:=1;//占领右下
                queen(j+1);//递归
                b[i]:=0;//回溯,恢复行占位标志
                c[i+j]:=0;//回溯,恢复斜上方(右上)占位标志
                d[j-i]:=0;///回溯,恢复斜下方(右下)占位标志
            end;
    end;
    begin//主程序
        read(n);
        for m:=-n+1 to 2*n do//数据初始化为0
        begin
            b[m]:=0;//行数据初始化为0
            c[m]:=0;//右上数据初始化为0
            d[m]:=0;//右下数据初始化为0
        end;
        queen(1);//开始放置第一个皇后
        if a[n]=0 then write('no solute!');
    end.
    

    Java :

    import java.util.Scanner;
    
    
    public class Main {
    	static int sum;
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		while(in.hasNextInt()){
    			int n = in.nextInt();
    			int[] a = new int[n+1];
    			sum = 0;
    			fun(a,1);
    			if(sum==0)
    				System.out.println("no solute!");
    		}
    	}
    	public static boolean isPlace(int[]a,int i){
    		for(int j=1;j<i;j++){
    			if(a[i]==a[j]||i+a[i]==j+a[j]||i-a[i]==j-a[j])
    				return false;
    		}
    		return true;
    	}
    	public static void fun(int[]a,int i){
    		if(i==a.length){
    			for(int k=1;k<a.length;k++){
    				System.out.printf("%5d",a[k]);
    			}
    			System.out.println();
    			sum++;
    			return;
    		}
    		for(int k=1;k<a.length;k++){
    			a[i] = k;
    			if(isPlace(a,i))
    				fun(a,i+1);
    		}
    	}
    }
    
    
    • 1

    Information

    ID
    693
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    10
    Tags
    # Submissions
    3
    Accepted
    1
    Uploaded By