zoj 1002回溯搜索

来源:互联网 发布:java 读取pdf文件 编辑:程序博客网 时间:2024/05/20 15:41
<a target=_blank href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002</a>
</pre><pre name="code" class="cpp">
#include <stdio.h>#include <memory.h>typedef struct{int x;int y;}Move;Move move[4]={{-1,0},{1,0},{0,-1},{0,1}};char g[5][5];int max,n;int check(int x,int y){int i,j,k,a,b;for(i=0;i<4;i++){a=x+move[i].x;b=y+move[i].y;while(a>=0&&a<n&&b>=0&&b<n){if(g[a][b]=='X'){break;}if(g[a][b]=='@'){return 0; }a+=move[i].x;b+=move[i].y;}}return 1;}void fun(int k,int cur) //k为当前层数     cur为当前炮台放置个数 {int i,j,x,y;if(k==n*n) // 遍历完了 {if(cur>max){max=cur;return;}}else{x=k/n;y=k%n; //计算当前坐标 if(g[x][y]=='.'){if(check(x,y)) //如果可以放的话 (为了找出最大值考虑所有情况){//就两种 当前位置放或不放 g[x][y]='@';fun(k+1,cur+1);//放 g[x][y]='.'; // 放完后 考虑不放时 要恢复原样 }}fun(k+1,cur); //不放 和放不了 }}int main(){int i,j,k;while(scanf("%d",&n)&&n){max=-1;for(i=0;i<n;i++){scanf("%s",g[i]);}fun(0,0);printf("%d\n",max);}return 0;}

0 0
原创粉丝点击