zoj1002-Fire Net
阿新 • • 發佈:2019-02-11
此題大意是在一個最大4*4網格組成的城市裡,每個網格可能為“牆壁”(用‘X’表示)和“街道”(用‘.’表示)。現在在街道放置碉堡,每個碉堡可以向上下左右四個方向開火,子彈射程無限遠。牆壁可以阻擋子彈。問最多能放置多少個碉堡,使它們彼此不會互相摧毀。
例如輸入:
.X..
....
XX..
....
則應輸出最大個數為5。
//將表格從0開始編號,即從0-15. 由於我們需要對每個單元格都進行一個判斷,所以我們採用k編號的方式而不是座標的方式 #include<iostream> using namespace std; char map[100][100]; int ans=0,n; int c_put(int x,int y) { //判斷行上是否合法 for(int i=x-1;i>=0;i--) { if(map[i][y]=='O')//如果此行上面有碉堡就返回 return 0; if(map[i][y]=='X')//如果在遇到碉堡之前先有了一道牆則繼續,可以放置 break; } //判斷在列上的合法性 for(int i=y-1;i>=0;i--) { if(map[x][i]=='O')//如果此列上面有碉堡就返回 return 0; if(map[x][i]=='X')//如果在遇到碉堡之前先有了一道牆則繼續,可以放置 break; } return 1; } void dfs(int k,int num)//當前的單元格的編號是k,當前情況下num為最大的碉堡數 { int x,y; if(k==n*n)//遍歷到最後一個單元格的下一個,說明之前所有的單元格都被遍歷了 { if(num>ans) ans=num; return ; } else { x=k/n; y=k%n; //如本單元格可以放置碉堡,採取: if(map[x][y]=='.'&&c_put(x,y))//當前位置是空地並且可以放置碉堡,不會產生衝突 { map[x][y]='O';//放置碉堡 dfs(k+1,num+1); map[x][y]='.';//恢復原始設定 } //如本單元格不可以放置碉堡,採取: dfs(k+1,num); } } int main() { while(cin>>n&&n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>map[i][j]; dfs(0,0); cout<<ans<<endl; } return 0; }