标签:wing more %s targe color main seve mit map
http://acm.hdu.edu.cn/showproblem.php?pid=1045
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16485 Accepted Submission(s):
10033
flag=0; //space!!; for(int i=0;i<4;i++) { int tw=w, tk=k;// 重点!!!!!!! 每次判断是从k,w对应的点开始; 如果把( int tw=w, tk=k;) 放在space!!处, // 会导致 第二个方向搜索的起点是第一个方向搜索的终点; while(1) { tw=tw+next[i][1]; tk=tk+next[i][0]; if(book[tk][tw]==0)//遇到边界 { break; } else if(book[tk][tw]==2)//遇到墙 { break; } else if(book[tk][tw]==3)//遇到碉堡 { flag=1; break; } //tw=tw+next[i][1]; tk=tk+next[i][0]; } } if(flag==0)// { book[k][w]=3; dfs(num+1); book[k][w]=1; }
#include<cstdio> #include<cstring> using namespace std; int n; char str[6]; int book[6][6]; int max; int flag; int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; void dfs(int num)//深度优先搜索 ,以放的数量为参数递归,一直递归到不能放为止; { //printf("%d\n",num); if(max<num) { max=num;//每次递归更新数据,从而得到最大值; } for(int k=1;k<=n;k++) { for(int w=1;w<=n;w++) { if(book[k][w]==1)//表示为空; { flag=0; //space!!; for(int i=0;i<4;i++) { int tw=w, tk=k;// 重点!!!!!!! 每次判断是从k,w对应的点开始; 如果把( int tw=w, tk=k;) 放在space!!处, // 会导致 第二个方向搜索的起点是第一个方向搜索的终点; while(1) { tw=tw+next[i][1]; tk=tk+next[i][0]; if(book[tk][tw]==0)//遇到边界 { break; } else if(book[tk][tw]==2)//遇到墙 { break; } else if(book[tk][tw]==3)//遇到碉堡 { flag=1; break; } //tw=tw+next[i][1]; tk=tk+next[i][0]; } } if(flag==0)// { book[k][w]=3; dfs(num+1); book[k][w]=1; } } } } } int main() { while(~scanf("%d",&n)) { if(n==0) { return 0; } memset(book,0,sizeof(book));//初始化,使没有赋值的都为零; for(int i=1;i<=n;i++) { getchar(); scanf("%s",str); for(int j=0;j<n;j++) { if(str[j]==‘.‘) { book[i][j+1]=1;//记录空的地方; } else if(str[j]==‘X‘) { book[i][j+1]=2;//记录有墙的地方; } }//book[i][j]=3记录碉堡;book[i][j]=0表示边界; } max=0; dfs(0); printf("%d\n",max); } return 0; }
标签:wing more %s targe color main seve mit map
原文地址:https://www.cnblogs.com/qqshiacm/p/10544504.html