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}