zju 1002
输入一个N,和N*N的棋盘布局,放入守卫,要求同行同列不能放置,如果遇到障碍物则可以放置,问最多可以放多少守卫。(原题地址:http://acm.zju.edu.cn/show_problem.php?pid=1002)
如第一个图为棋盘布局,第2个图为放置5个守卫(最多),第3个图合格但不是最多的,第4 5个图不合格。
输入:先输入一个N,下面N行为棋盘布局,'.'代表畅通,'X'代表障碍物.
遇到0代表结束.
输出:对于每个棋盘,输出可以放置的最多守卫数.
Sample input:
4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0
Sample output:
5 1 5 2 4
这道题和8皇后问题有点像,就是用DFS搜索,我先还以为用动态规划,想半天递推公式没想出来。。
1/*zju 1002
2by woodfish
3*/
4#include<iostream>
5using namespace std;
6
7char map[5][5];
8int n;
9int mmax;
10
11void init(){
12int i,j;
13for(i=0;i<n;i++) {
14for(j=0;j<n;j++)
15cin>>map[i][j];
16}
17}
18
19int Putcan(int col,int row){
20int i,j;
21for(i=row-1;i>=0;i--) {
22if(map[col][i]=='0')
23return 0;
24else if(map[col][i]=='X')
25break;
26}
27for(j=col-1;j>=0;j--) {
28if(map[j][row]=='0')
29return 0;
30else if(map[j][row]=='X')
31break;
32}
33return 1;
34}
35
36void Slove(int pos,int ccount){
37int col,row;
38if(pos==n*n) {
39if(mmax<ccount)
40mmax=ccount;
41return;
42}
43col=pos/n;
44row=pos%n;
45if(map[col][row]=='.'&&Putcan(col,row)) {
46map[col][row]='0';
47Slove(pos+1,ccount+1);
48map[col][row]='.';
49}
50Slove(pos+1,ccount);
51}
52
53int main(){
54while(cin>>n&&n) {
55mmax=0;
56init();
57Slove(0,0);
58cout<<mmax<<endl;
59}
60return 0;
61}