题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
刚开始也不知道怎么做,用了下搜索,但本人做不下去了。
后来想到既然是贪心题目,那就贪心把,能放就放,就添加了一个 isok。
下面这个代码是第二次在[kuangbin带你飞]专题提交的代码:
思路是:枚举起点,然后按从左到右,从上到下的顺序放置,能放就放,然后dfs。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char Map[10][10]; int vis[10][10]; int N; int isok(int x,int y){ for(int i=x+1;i<N;i++) if(Map[i][y]=='X') break; else if(vis[i][y]) return 0; for(int i=x-1;i>=0;i--) if(Map[i][y]=='X') break; else if(vis[i][y]) return 0; for(int j=y+1;j<N;j++) if(Map[x][j]=='X') break; else if(vis[x][j]) return 0; for(int j=y-1;j>=0;j--) if(Map[x][j]=='X') break; else if(vis[x][j]) return 0; return 1; } int ans; void dfs(int x,int y,int count){ ans=max(ans,count); for(int j=y+1;j<N;j++) if(Map[x][j]!='X' && !vis[x][j] && isok(x,j)){ vis[x][j]=1; dfs(x,j,count+1); vis[x][j]=0; } for(int i=x+1;i<N;i++) for(int j=0;j<N;j++) if(Map[i][j]!='X' && !vis[i][j] &&isok(i,j)){ vis[i][j]=1; dfs(i,j,count+1); vis[i][j]=0; } } int main(){ while(cin>>N && N) { for(int i=0;i<N;i++) for(int j=0;j<N;j++) cin>>Map[i][j]; ans=0; for(int i=0;i<N;i++){ for(int j=0;j<N;j++) if(Map[i][j]!='X'){ memset(vis,0,sizeof(vis)); vis[i][j]=1; dfs(i,j,1); } } cout<<ans<<endl; } return 0; }