1 条题解

  • 0
    @ 2024-12-24 9:54:30

    C++ :

    //回溯法
    #include<iostream>
    #include<string>
    using namespace std;
    char map[4][4];
    int best, n;
    int place(int row, int col)
    {
    	int i;
    	for (i = col - 1; i >= 0; i--){   //向左方向
    		if (map[row][i] == 'X') break;
    		if (map[row][i] == '1') return 0;
    	}
    	int j = col;
    	for (i = row - 1; i >= 0; i--){   //左上方向
    		j--;
    		if (j<0) break;
    		if (map[i][j] == 'X') break;
    		if (map[i][j] == '1') return 0;
    	}
    	j = col;
    	for (i = row - 1; i >= 0; i--){   //右上方向
    		j++;
    		if (j>n - 1) break;
    		if (map[i][j] == 'X') break;
    		if (map[i][j] == '1') return 0;
    	}
    
    	for (i = row - 1; i >= 0; i--){  //向上方向
    		if (map[i][col] == 'X') break;
    		if (map[i][col] == '1') return 0;
    	}
    
    	return 1;
    }
    void Backtrack(int t, int sum)
    {
    	if (t >= n*n){
    		if (sum>best) best = sum;
    		return;
    	}
    	int col, row;
    	row = t / n; col = t%n;
    	if (map[row][col] == '.'){
    		if (place(row, col))
    		{
    
    			map[row][col] = '1'; //放炮后,递归
    			Backtrack(t + 1, sum + 1);
    			map[row][col] = '.';//不放炮,递归
    		}
    	}
    	Backtrack(t + 1, sum);
    }
    
    int main()
    {
    	while (cin >> n)
    	{
    		int i;
    		int j;
    		for (i = 0; i < n; i++)
    		for (j = 0; j < n; j++)
    			cin >> map[i][j];
    		best = 0;
    		Backtrack(0, 0);
    		cout << best << endl;
    	}
    	return 0;
    }
    
    

    Java :

    
    
    import java.io.BufferedInputStream;
    import java.util.Scanner;
    
    public class Main{
    	public static void main(String[] args) {
    		Scanner input = new Scanner(new BufferedInputStream(System.in));
    		while(input.hasNext()){
    			int n = Integer.parseInt(input.nextLine());
    			char[][] chessboardArr = new char[n][n];
    			for(int i = 0;i < n;i++){
    				String str = input.nextLine();
    				for(int j = 0;j < n;j++){
    					chessboardArr[i][j] = str.charAt(j);
    				}
    			}
    			int[] max = new int[2];
    			for(int i = 0;i < chessboardArr.length;i++)
    				for(int j = 0;j < chessboardArr.length;j++)
    					findMax(chessboardArr,i,j,max);
    			System.out.println(max[0]);
    		}
    	}
    
    	private static void findMax(char[][] chessboardArr,int x,int y,int[] max) {
    		if(y >= chessboardArr.length){
    			x++;
    			y = 0;
    		}
    		if(x >= chessboardArr.length){
    			if(max[1] > max[0])
    				max[0] = max[1];
    			max[1] = 0;
    			return;
    		}
    		if(canPlace(chessboardArr,x,y)){
    			chessboardArr[x][y] = 'Q';
    			max[1]++;
    			findMax(chessboardArr,x,y + 1,max);
    			chessboardArr[x][y] = '.';
    		}else{
    			findMax(chessboardArr,x,y + 1,max);
    		}
    	}
    
    	private static boolean canPlace(char[][] chessboardArr, int x, int y) {
    		boolean canPlace = true;
    		if(chessboardArr[x][y] == 'X')
    			canPlace = false;
    		if(canPlace)
    			for(int i = x;i >= 0;i--){
    				if(chessboardArr[i][y] == 'X')
    					break;
    				if(chessboardArr[i][y] == 'Q'){
    					canPlace = false;
    					break;
    				}
    			}
    		
    		if(canPlace)
    			for(int i = y;i >= 0;i--){
    				if(chessboardArr[x][i] == 'X')
    					break;
    				if(chessboardArr[x][i] == 'Q'){
    					canPlace = false;
    					break;
    				}
    			}
    		
    		if(canPlace)
    			for(int i = x,j = y;i >= 0 && j >= 0;i--,j--){
    				if(chessboardArr[i][j] == 'X')
    					break;
    				if(chessboardArr[i][j] == 'Q'){
    					canPlace = false;
    					break;
    				}
    			}
    		
    		if(canPlace)
    			for(int i = x,j = y;i >= 0 && j < chessboardArr.length;i--,j++){
    				if(chessboardArr[i][j] == 'X')
    					break;
    				if(chessboardArr[i][j] == 'Q'){
    					canPlace = false;
    					break;
    				}
    			}
    		
    		return canPlace;
    	}
    }
    
    
    • 1

    信息

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