[关闭]
@lychee123 2017-07-04T14:57:21.000000Z 字数 1043 阅读 1377

ZOJ-1002:Fire Net (DFS)

搜索


题面链接

4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0
Sample output:
5
1
5
2
4

注意变量的定义!!!!出了好几次这样的错误了!要用再定义!不要全部定义在全局里!!会出问题的!!!还有BFS和DFS都是判断该点是否符合操作的条件。但是就算满足条件你也可以选择不放。放和不放是一种选择!!

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int i,j,n,ans;
  4. int cnt,num;
  5. char mp[11][11];
  6. //'.'表示平地可以放炮
  7. //'#'表示已经放了炮
  8. //'X'表示墙不能放炮
  9. int check(int x,int y)//判断x,y位置是否可以放炮
  10. {
  11. for(i=x-1;i>=0;i--)
  12. {
  13. if(mp[i][y]=='#')//这一行已经有炮了
  14. return 0;
  15. if(mp[i][y]=='X')//有墙
  16. break;
  17. }
  18. for(i=y-1;i>=0;i--)
  19. {
  20. if(mp[x][i]=='#')//这一列已经有炮了
  21. return 0;
  22. if(mp[x][i]=='X')
  23. break;
  24. }
  25. return 1;
  26. }
  27. void DFS(int num,int cnt)//num:遍历的点的个数,cnt:放的炮的个数
  28. {
  29. int x,y;
  30. if(num==n*n)//边界条件
  31. {
  32. if(ans<cnt)
  33. {
  34. ans=cnt;
  35. }
  36. return;
  37. }
  38. else
  39. {
  40. x=num/n;//行
  41. y=num%n;//列
  42. if((mp[x][y]=='.')&&(check(x,y)==1))//该点是平地,并且周围条件可放炮
  43. {
  44. mp[x][y]='#';//更新这一点为放炮的状态
  45. DFS(num+1,cnt+1);//递归进入下一个状态
  46. mp[x][y]='.';//回溯
  47. }
  48. DFS(num+1,cnt);//不管这个点合不合适,我都可以选择不放
  49. }
  50. }
  51. int main()
  52. {
  53. while(scanf("%d",&n)&&n!=0)
  54. {
  55. for(i=0;i<n;i++)
  56. scanf("%s",&mp[i]);
  57. ans=0;
  58. DFS(0,0);
  59. printf("%d\n",ans);
  60. }
  61. return 0;
  62. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注