hdu1045 Fire Net dfs
阿新 • • 發佈:2019-01-09
#include <bits/stdc++.h> using namespace std; char mp[5][5]; int n,maxn; bool ok(int x,int y){ if(mp[x][y]=='x'||mp[x][y]=='X') return false; for(int i=y;i<=n;i++){ if(mp[x][i]=='x') return false; if(mp[x][i]=='X') break; } for(int i=y;i>=1;i--){ if(mp[x][i]=='x') return false; if(mp[x][i]=='X') break; } for(int i=x;i<=n;i++){ if(mp[i][y]=='x') return false; if(mp[i][y]=='X') break; } for(int i=x;i>=1;i--){ if(mp[i][y]=='x') return false; if(mp[i][y]=='X') break; } return 1; } void dfs(int c_x,int c_y,int c_n){ int dx=0; int dy=0; if(maxn<c_n) maxn=c_n; for(int i=c_x;i<=n;i++){ for(int j=1;j<=n;j++){//在該位之後找 if(i==c_x&&j<=c_y) continue; if(!ok(i,j)) continue;//判斷該點是否能放 dx=i; dy=j; mp[i][j]='x'; dfs(dx,dy,c_n+1); mp[i][j]='.'; } } if(dx==0&&dy==0) return ;//找不到新的可放位置結束 } int main(){ while(cin>>n&&n){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) cin>>mp[i][j]; } maxn=-1; dfs(1,0,0); cout<<maxn<<endl; /*for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) cout<<mp[i][j]<<' '; cout<<endl; }*/ } }