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()
12  int i,j; 
13  for(i=0;i<n;i++
14    for(j=0;j<n;j++)   
15      cin>>map[i][j];  
16  }

17}

18
19int Putcan(int col,int row)
20  int i,j; 
21  for(i=row-1;i>=0;i--{  
22    if(map[col][i]=='0')   
23      return 0;  
24    else if(map[col][i]=='X')   
25      break
26  }
 
27  for(j=col-1;j>=0;j--{  
28    if(map[j][row]=='0')   
29      return 0;  
30    else if(map[j][row]=='X')   
31      break;    
32    }
 
33    return 1;
34}

35
36void Slove(int pos,int ccount){     
37  int col,row; 
38  if(pos==n*n) {  
39    if(mmax<ccount)   
40      mmax=ccount;  
41    return
42  }
 
43  col=pos/n; 
44  row=pos%n; 
45  if(map[col][row]=='.'&&Putcan(col,row)) {  
46    map[col][row]='0';  
47    Slove(pos+1,ccount+1);  
48    map[col][row]='.'
49  }
  
50  Slove(pos+1,ccount);
51}

52
53int main()
54  while(cin>>n&&n) {  
55    mmax=0;  
56    init();  
57    Slove(0,0);  
58    cout<<mmax<<endl;
59  }

60  return 0;
61}

posted on 2006-11-10 18:53  woodfish  阅读(1112)  评论(5编辑  收藏  举报

导航