1 条题解
-
0
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
- 上传者