sdau-2 1010

描述:

你是防守队员,打橄榄球时,你要绕过对方防守队员KO四分卫

 
 
6 6
.Q....
QQ..OO
.OO..O
...O.O
OO.O..
....DD
7 7
.Q.....
QQ.OOO.
...O...
O......
OO..OO.
.O.....
.....DD
0 0
Q是四分卫,O是敌方防守队员,D是你,输入00结束
思路:
哎....一开始没审题,以为一个字母代表一个人,结果一直GG,后来才明白。这题是个广搜题。有点麻烦的地方在于D是连一块的,需要方法来让他们一起移动,一种方法是选一个中心,然后记下坐标,算出其他D的相对位置。第二种是用一个数组储存每个D。然后直接广搜就好了。
代码:
#include <iostream> #include <stdio.h> #include <queue> using namespace std; int dir[4][2] = {-1,0,1,0,0,-1,0,1}; int h,w,bx[21],by[21],k; char map[101][101]; int mark[101][101]; typedef struct {     int bodx[21],body[21],steps; }node; node pre,cur; queue<node> q; bool judge(node a) {     for(int j = 0; j < k; j++)     {         if(map[a.bodx[j]][a.body[j]]=='Q')         return true;     }     return false; } node changedirec(node a,int x,int y) {     for(int j = 0; j < k; j++)     {         a.bodx[j] = a.bodx[j] + x;         a.body[j] = a.body[j] + y;     }     return a; } bool if_over(node a) {     if(mark[a.bodx[0]][a.body[0]]==0)return false;     else return true; } bool J_ifCanGo(node a)  {     for(int j = 0; j < k; j++)     {         if(a.bodx[j]<1||a.bodx[j]>h||a.body[j]<1||a.body[j]>w||map[a.bodx[j]][a.body[j]]=='O')         return false;     }     return true; } void set_over(node a) {     mark[a.bodx[0]][a.body[0]] = 1; } void bfs() {     int i;     pre.steps = 0;     for(i = 0; i < k ; i++)     {         pre.bodx[i] = bx[i];         pre.body[i] = by[i];     }     while(!q.empty())q.pop();     q.push(pre);     set_over(pre);     while(!q.empty())     {         pre = q.front();         q.pop();         if(judge(pre))         {             printf("%d\n",pre.steps);             return;         }         for(i = 0; i < 4; i++)         {             cur = changedirec(pre,dir[i][0],dir[i][1]);             cur.steps = pre.steps + 1;             if(J_ifCanGo(cur))             {                 if(!if_over(cur))                 {                     set_over(cur);                     q.push(cur);                 }             }         }     }     printf("Impossible\n"); } int main() {     while(scanf("%d%d",&h,&w))     {         if(h==0&&w==0)break;         k = 0;         for(int i = 1; i <= h; i++)         {             getchar();             for(int j = 1; j <= w; j++)             {                 mark[i][j] = 0;                 scanf("%c",&map[i][j]);                 if(map[i][j]=='D')                 {                     bx[k] = i;                     by[k] = j;                     k++;                 }             }         }         bfs();     }     return 0; }

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值