题目1254:N皇后问题

来源:互联网 发布:浙江大学 人工智能 编辑:程序博客网 时间:2024/05/22 12:31

题目1254:N皇后问题

时间限制:1 秒

内存限制:128 兆

特殊判题:


题目描述:

N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。


你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。

输入:

输入包含多组测试数据。
每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。

输出:

对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。

样例输入:
4
样例输出:
2

import java.io.BufferedInputStream;import java.io.PrintWriter;import java.util.Arrays;import java.util.Scanner;public class Main {      public static void main(String[] args){          Scanner cin = new Scanner(new BufferedInputStream(System.in)) ;      PrintWriter cout = new PrintWriter(System.out) ;             int[] dp = new int[14] ;      for(int i = 3 ; i <= 13 ; i++) dp[i] = new Task().solve(i) ;           while(cin.hasNext()){      cout.println( dp[cin.nextInt()] )  ;     // cout.flush() ;      }        cout.flush() ;    }  }class  Task{      boolean[][] used  ;   int n ;   int   solve(int n){         this.n = n ;     used = new boolean[n][n] ;         for(int i = 0 ; i < n ; i++) Arrays.fill(used[i] , false) ;                  return dfs(0) ;   }      int dfs(int row){   if(row == n) return 1 ;      int sum =  0 ;   for(int col = 0 ; col < n ; col++){       if(valid(row , col)){         used[row][col] = true ;         sum += dfs(row+1) ;         used[row][col] = false ;       }   }      return sum  ;   }      boolean valid(int row , int col){       for(int r = 0 ; r < row ; r++){        if(used[r][col]) return false ;       }               int x = row , y = col ;       while(x >= 0 && y >= 0){       if(used[x][y]) return false ;       x-- ;       y-- ;       }              x = row ; y = col ;       while(x >= 0 && y < n){       if(used[x][y]) return false ;       x-- ;       y++ ;       }          return true ;   }   }




1 0
原创粉丝点击