题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045
程序分析:
题目是说在一个特殊的地图里摆设碉堡,限制条件可能跟N皇后又点相似,但是这里有墙,中间隔有墙的话还是不会互相干扰的。只是行列方向会冲突,斜角线不会冲突,。所以我们只有判断所在的行列不会存在冲突的碉堡就行。注意中间可以隔有墙。记住每一次到达最后一个点时的可放碉堡数,比现在保存最大的就替换为最大值。
解决方法:
深搜回溯,找出每一种方法的最大放置碉堡数,编写一个判断能否放置碉堡的函数,细节看代码。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int n, m; 6 char map[5][5]; 7 int Max; 8 9 int pd(int x, int y) 10 { 11 for(int i=x-1; i>=0; i--) //判断此行能否放置碉堡 12 { 13 if(map[i][y] == '0') 14 return 0; 15 if(map[i][y] == 'X') 16 break; 17 } 18 for(int j=y-1; j>=0; j--) //判断此行能否放置碉堡 19 { 20 if(map[x][j] == '0') 21 return 0; 22 if(map[x][j] == 'X') 23 break; 24 } 25 return 1; 26 } 27 28 void DFS(int k, int curmax) 29 { 30 int x, y; 31 if(k == n*n) //到达最后一个点 32 { 33 if(Max < curmax) //保存这一种方法最多能摆的碉堡数 34 { 35 Max = curmax; 36 return ; 37 } 38 } 39 else 40 { 41 x = k/n; 42 y = k%n; 43 if(map[x][y]=='.' && pd(x, y)==1) //可以摆放就把个数加一继续找下一个可以摆的地方 44 { 45 map[x][y] = '0'; 46 DFS(k+1, curmax+1); 47 map[x][y] = '.'; 48 } 49 DFS(k+1, curmax); //不能摆或者回溯回来进行下一个地方的查找 50 } 51 } 52 int main() 53 { 54 while(cin>>n && n) 55 { 56 for(int i=0; i<n; i++) 57 { 58 scanf("%s", map[i]); 59 } 60 Max = 0; 61 DFS(0, 0); 62 cout<<Max<<endl; 63 } 64 return 0; 65 }