博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4101 Ali and Baba
阅读量:6950 次
发布时间:2019-06-27

本文共 2354 字,大约阅读时间需要 7 分钟。

两次广搜

#include
#include
#include
#include
#include
using namespace std;const int maxn=305;int N,M,Sx,Sy;int Map[maxn][maxn];int Y[maxn][maxn];int e[maxn][maxn];int flag[maxn][maxn];int Flag[maxn][maxn];int F[maxn][maxn];int dir[4][2]={
{-1,0},{
1,0},{
0,-1},{
0,1}};int ans,sum;struct Point{ int x,y; Point(int a,int b){x=a;y=b;}};void init(){ memset(flag,0,sizeof flag);//标记有没有走过 memset(F,0,sizeof F);//标记是否是边界 memset(Map,0,sizeof Map); memset(Flag,0,sizeof Flag); memset(e,0,sizeof e); memset(Y,0,sizeof Y); ans=-1,sum=0;}void read(){ for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) { scanf("%d",&Map[i][j]); Y[i][j]=Map[i][j]; }}void bfs1(){ queue
Q; Point p(Sx,Sy); flag[Sx][Sy]=1; Q.push(p); while(!Q.empty()) { Point p=Q.front(); Q.pop(); if(Map[p.x][p.y]!=0&&Map[p.x][p.y]!=-1) { F[p.x][p.y]=1;//边界标1 continue; } for(int i=0;i<4;i++) { int NewX=p.x+dir[i][0]; int NewY=p.y+dir[i][1]; if(!flag[NewX][NewY]) if(NewX>=1&&NewX<=N) if(NewY>=1&&NewY<=M) { flag[p.x][p.y]=1; Point p(NewX,NewY); Q.push(p); } } } /* for(int i=1;i<=N;i++) { for(int j=1;j<=M;j++) printf("%d",F[i][j]); printf("\n"); } */}void bfs2(){ queue
Q; Point p(0,0); Flag[0][0]=1; Q.push(p); while(!Q.empty()) { Point p=Q.front(); Q.pop(); //printf("%d %d %d\n",p.x,p.y,Map[p.x][p.y]); if(Map[p.x][p.y]) { if(F[p.x][p.y]) { sum=sum+Map[p.x][p.y]-1; continue; } else sum=sum+Map[p.x][p.y]; } for(int i=0;i<4;i++) { int NewX=p.x+dir[i][0]; int NewY=p.y+dir[i][1]; if(Flag[NewX][NewY]==0) if(NewX>=0&&NewX<=N+1) if(NewY>=0&&NewY<=M+1) { Flag[NewX][NewY]=1; Point p(NewX,NewY); Q.push(p); } } }}void dfs(int x,int y){ if(x==0||x==N+1||y==0||y==M+1) {ans=1;return;} e[x][y]=1; for(int i=0;i<4;i++) { int NewX=x+dir[i][0]; int NewY=y+dir[i][1]; if(Y[NewX][NewY]==0) if(e[NewX][NewY]==0) dfs(NewX,NewY); }}void solve(){ for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) if(Map[i][j]==-1) Sx=i,Sy=j; e[Sx][Sy]=1;dfs(Sx,Sy); if(ans==1){printf("Ali Win\n");return;} bfs1(); bfs2(); // printf("%d\n",sum); if(sum%2==1) printf("Ali Win\n"); else printf("Baba Win\n");}int main(){ while(~scanf("%d%d",&N,&M)) { init(); read(); solve(); } return 0;}

 

转载于:https://www.cnblogs.com/zufezzt/p/4927839.html

你可能感兴趣的文章
PHP服务器负载判断
查看>>
爬取猎聘大数据岗位相关信息--Python
查看>>
HDU-3072-IntelligenceSystem(tarjan,贪心)
查看>>
upload控件
查看>>
【Foreign】Weed [线段树]
查看>>
js实现轮播图常规类(原生JS,没有任何框架)
查看>>
快速上手Git
查看>>
求符合给定条件的整数集(15)
查看>>
在字符串中查找指定字符(15)
查看>>
jdk及tomcat的安装
查看>>
hbase常识及habse适合什么场景
查看>>
JAVA 中一个非常轻量级只有 200k 左右的 RESTful 路由框架
查看>>
2018.8.5 复习笔记
查看>>
【转】 DOTA2中的伪随机及其lua实现
查看>>
A*算法、导航网格、路径点寻路对比(A-Star VS NavMesh VS WayPoint)
查看>>
sys
查看>>
webSQL 实现即时通讯
查看>>
Monkey学习笔记<三>:Monkey脚本编写
查看>>
tomcat监听activemq jms配置
查看>>
页面中引入js的几种方法
查看>>