3502 未完成啊!!

  1 #include <iostream>
  2 #include <deque>
  3 #define N 256
  4 using namespace std;
  5 struct fruit        //保存水果的坐标,数组的第1个元素的能量,用来记录水果的数目
  6 {
  7     int x;
  8     int y;
  9     int energy;        //能量
 10     int dis_toend;
 11     int dis_tostart;
 12
 13 }fruits[18];        //记录水果的位置
 14
 15 struct node
 16 {
 17     int x;
 18     int y;
 19     int fru_num;    //水果编号
 20     int energy;        //能量
 21 }map[N][N];
 22
 23 int dist[18][18];    //dist[i][j]表示第i个水果到第j个水果的距离
 24 bool vis[N][N];        //记录脚印
 25 int num;            //水果数量
 26 int m,n;            //m行n列
 27 deque<node> queue;    //队列
 28
 29
 30 int to_begin()    //到起点的距离,保存在fruits_s;到终点的距离,保存在fruits_e。先起点,后终点。
 31 {
 32     queue.clear();
 33     memset(vis,0,sizeof(vis));
 34     queue.push_back(map[0][0]);        //先入队列
 35     vis[0][0]=1;        //置为浏览过
 36
 37     int cor=map[0][0].energy;    //起点开始能走的步数
 38     int temp_num=0;    //记录走了几步
 39     int temp_n=0;    //已发现的水果数量
 40
 41     while(queue.empty()==false && cor-- )    //队列不空,且无法够着其他水果。
 42     {
 43         int size=queue.size();
 44         for(int i=0; i<size; i++)        //第temp_num步可达的,全部遍历一次
 45         {
 46             if(queue.front().energy>0)    //此点有水果,保存距离
 47             {
 48                 fruits[queue.front().fru_num].dis_tostart=temp_num;
 49                 if(num==++temp_n)    return 0;        //各水果均已搜过。每搜到一水果就进行判断
 50             }
 51             node temp=queue.front();
 52             queue.pop_front();    //出队
 53             //将身边结点入队列,考虑四个方向
 54             if(temp.x-1>=0 && map[temp.x-1][temp.y].energy>=0 && vis[temp.x-1][temp.y]==0)    //同一行的,且未被访问过
 55             {
 56                 vis[temp.x-1][temp.y]=1;    //置为浏览过
 57                 queue.push_back( map[temp.x-1][temp.y] );    //入队列
 58             }
 59             if(temp.x+1<m && map[temp.x+1][temp.y].energy>=0 && vis[temp.x+1][temp.y]==0)    //同一行的
 60             {
 61                 vis[temp.x+1][temp.y]=1;
 62                 queue.push_back( map[temp.x+1][temp.y] );
 63             }
 64             if(temp.y-1>=0 && map[temp.x][temp.y-1].energy>=0 && vis[temp.x][temp.y-1]==0)    //同一列的
 65             {
 66                 vis[temp.x][temp.y-1]=1;
 67                 queue.push_back( map[temp.x][temp.y-1] );
 68             }
 69             if(temp.y+1<n && map[temp.x][temp.y+1].energy>=0 && vis[temp.x][temp.y+1]==0)    //同一列的
 70             {
 71                 vis[temp.x][temp.y+1]=1;
 72                 queue.push_back( map[temp.x][temp.y+1] );
 73             }
 74
 75         }
 76         temp_num++;    //步数
 77     }
 78     return 0;
 79 }
 80
 81
 82 int to_end()    //到终点的距离
 83 {
 84     queue.clear();
 85     memset(vis,0,sizeof(vis));
 86     queue.push_back(map[m-1][n-1]);        //先入队列
 87     vis[m-1][n-1]=1;        //置为浏览过
 88     int temp_num=0;                //记录走了几步
 89     int temp_n=0;                //已发现的水果数量
 90
 91     while(queue.empty()==false)    //队列不空,且无法够着其他水果。
 92     {
 93         int size=queue.size();
 94         for(int i=0; i<size; i++)        //第temp_num步可达的,全部遍历一次
 95         {
 96             if(queue.front().energy>0)    //此点有水果,保存距离
 97             {
 98                 fruits[queue.front().fru_num].dis_toend=temp_num;
 99                 if(num==++temp_n)    return 0;        //各水果均已搜过。每搜到一水果就进行判断
100             }
101             node temp=queue.front();
102             queue.pop_front();    //出队
103             //将身边结点入队列,考虑四个方向
104             if(temp.x-1>=0 && map[temp.x-1][temp.y].energy>=0 && vis[temp.x-1][temp.y]==0)    //同一行的,且未被访问过
105             {
106                 vis[temp.x-1][temp.y]=1;    //置为浏览过
107                 queue.push_back( map[temp.x-1][temp.y] );    //入队列
108             }
109             if(temp.x+1<m && map[temp.x+1][temp.y].energy>=0 && vis[temp.x+1][temp.y]==0)    //同一行的
110             {
111                 vis[temp.x+1][temp.y]=1;
112                 queue.push_back( map[temp.x+1][temp.y] );
113             }
114             if(temp.y-1>=0 && map[temp.x][temp.y-1].energy>=0 && vis[temp.x][temp.y-1]==0)    //同一列的
115             {
116                 vis[temp.x][temp.y-1]=1;
117                 queue.push_back( map[temp.x][temp.y-1] );
118             }
119             if(temp.y+1<n && map[temp.x][temp.y+1].energy>=0 && vis[temp.x][temp.y+1]==0)    //同一列的
120             {
121                 vis[temp.x][temp.y+1]=1;
122                 queue.push_back( map[temp.x][temp.y+1] );
123             }
124
125         }
126         temp_num++;    //步数
127     }
128     return 0;
129 }
130
131
132 int dis()    //每个点之间的距离,另:需计算起点到终点的距离
133 {
134     for(int i=0;i<num;i++)
135     {
136         memset(vis,0,sizeof(vis));    //清内存
137         queue.clear();    //清队列
138         vis[fruits[i].x][fruits[i].y]=1;        //置为浏览过
139         queue.push_back( map[fruits[i].x][fruits[i].y]);
140
141         int temp_num=0;                //记录走了几步
142         int temp_n=0;                //已发现的水果数量
143         while(queue.empty()==false)
144         {
145             int size=queue.size();
146             for(int j=0;j<size;j++)
147             {
148                 if(queue.front().energy>0)    //此点有水果,保存距离
149                 {
150                     dist[i][queue.front().fru_num]=temp_num;
151                     if(num==++temp_n)//各水果均已搜过。每搜到一水果就进行判断
152                     {
153                         queue.clear();
154                         break;
155                     }
156                 }
157                 node temp=queue.front();
158                 queue.pop_front();    //出队
159                 //将身边结点入队列,考虑四个方向
160                 if(temp.x-1>=0 && map[temp.x-1][temp.y].energy>=0 && vis[temp.x-1][temp.y]==0)    //同一行的,且未被访问过
161                 {
162                     vis[temp.x-1][temp.y]=1;    //置为浏览过
163                     queue.push_back( map[temp.x-1][temp.y] );    //入队列
164                 }
165                 if(temp.x+1<m && map[temp.x+1][temp.y].energy>=0 && vis[temp.x+1][temp.y]==0)    //同一行的
166                 {
167                     vis[temp.x+1][temp.y]=1;
168                     queue.push_back( map[temp.x+1][temp.y] );
169                 }
170                 if(temp.y-1>=0 && map[temp.x][temp.y-1].energy>=0 && vis[temp.x][temp.y-1]==0)    //同一列的
171                 {
172                     vis[temp.x][temp.y-1]=1;
173                     queue.push_back( map[temp.x][temp.y-1] );
174                 }
175                 if(temp.y+1<n && map[temp.x][temp.y+1].energy>=0 && vis[temp.x][temp.y+1]==0)    //同一列的
176                 {
177                     vis[temp.x][temp.y+1]=1;
178                     queue.push_back( map[temp.x][temp.y+1] );
179                 }
180             }
181             temp_num++;    //步数
182         }
183     }
184     return 0;
185 }
186
187
188 //深搜求解。最大时17!次要计算。只挑1个,2个,3个。。。直到num个,就有num种。每一种都是乱序的。不知道如何实现。
189 int forth()
190 {
191     int ans=-1;//答案
192     stack<fruit> sta;
193     sta.push(fruits[0]);    //[0][0],入口处的水果先进来
194     while(sta.empty()==false)    //栈非空
195     {
196
197     }
198 }
199
200 int main()
201 {
202     int i,j;
203     while(cin>>m>>n)
204     {
205         num=0;
206         memset(fruits,0,sizeof(fruits));
207         memset(map,0,sizeof(map));
208         for(i=0;i<m;i++)
209             for(j=0;j<n;j++)
210             {
211                 scanf("%d",&map[i][j].energy);
212                 map[i][j].x=i;
213                 map[i][j].y=j;
214                 if(map[i][j].energy>0)
215                 {
216                     map[i][j].fru_num=num;    //水果编号0~16
217                     fruits[num].x=i;
218                     fruits[num].y=j;
219                     fruits[num++].energy=map[i][j].energy;
220                 }
221             }
222         to_begin();
223         to_end();
224         dis();
225
226     }
227
228     return 0;
229 }

时间: 2024-10-11 14:15:36

3502 未完成啊!!的相关文章

expect 实现交互(未完成)

expect介绍 expect命令是一个实现交互功能的软件套件,是基于TCL的脚本编程语言,在企业运维中,系统会以交互的形式要求运维人员输入指定的字符串,之后才能继续执行命令.例如:为用户设置密码时,一般情况下需要手工输入两次密码,比如使用ssh连接远程服务器时,第一次连和系统实现两次交互. 简单的说,expect用来自动实现与交互程序通信的,无需管理员手工干预 spawn启动指定进程>expect获取期待的关键字>send向指定进程发送字符>进程执行完毕,退出 expect  表达式 

化学方程式配平【测试中】【未完成】

化学元素周期表(Element.txt): 1    H    氢    12    He    氦    43    Li    锂    74    Be    铍    95    B    硼    116    C    碳    127    N    氮    148    O    氧    169    F    氟    1910    Ne    氖    2011    Na    钠    2312    Mg    镁    2413    Al    铝    27

《此生未完成》读后感

曾几何时,看了一遍又一遍<此生未完成>,并非因为它是一个将死之人的生命日记,也并非是想提醒自己应该珍惜当下,好好保养身体,或许是于娟的文笔有触动人心弦的地方,也或许是真心想知道活着的意义吧 书简介 <此生未完成>是于娟临时的生命日记 .于娟--女,山东济宁人,1979年4月-2011年4月.2008年,获复旦大学经济学博士学位. 于娟在2009年12月于娟确诊患乳腺癌后,写下一年多病中日记,在日记中反思生活细节,在生命的最后日子里,于娟完全放下了生死,放下了名利权情,写下了这本&l

Android Configuration介绍 (未完成)

博客很空,想赶紧填一篇东西,选的这个题目看了下中文网络中还不是很常见,但是由于我也不了解全部的configuration,需要验证思路,写起来也很慢,先发个未完成的占座. 所谓Configuration指的是Configuration.java这个类所代表的配置信息,它的位置在($ANDROID_ROOT)/frameworks/base/core/java/android/content/res/Configuration.java 本文分三部分: 一. 逐一讲解成员变量,了解功能和每一个数值

【shell】oracle安装脚本 - 未完成

自动安装oracle所需要的rpm包(需要访问外网): #! /bin/sh rpmpack=" binutils compat-libstdc++* elfutils-libelf elfutils-libelf-devel elfutils-libelf-devel-static gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers kernel-headers ksh libaio libaio-devel libgcc libg

解决yum安装过程中断导致后续使用yum始终提示有未完成事务的问题

今天在用yum装软件的时候手贱点了ctrl+c,在后面使用yum的时候始终提示:There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them. 意思是说有未完成的yum事务,建议先运行yum-complete-transaction命令清除 解决办法:安装 yum-complete-transaction,提示中已经给出了这

【未完成】《统计机器翻译》读书笔记:系列0,全书概述与个人总结

说明:本系列文章是本人在阅读统计机器翻译后所做的个人读书笔记,会按照每一章的顺序来按章详细叙述内容总结和习题解答. 系列0:全书概述与个人总结 本书是大牛Philipp Koehn的作品,他是开源项目Moses项目的领导者,具体可以去www.statmt.org/moses/查看,我也会在未来的半个月写一些有关Moses学习的博文. 本书分为三个部分:基础知识(介绍机器翻译需要语言学的基础.概率论的基础).核心方法(基于词的翻译模型.基于短语的翻译模型.解码decoding).前沿研究 在绪论部

leetcode 算法 之 马拉松算法(Manacher&#39;s algorithm)(未完成)

马拉松算法:马拉松算法是用来计算一个字符串中最长的回文字符串(对称字符串,如aba abba). 首先,我们拿到一个字符串S,然后在S中的每个字符之间加#.例如:S="abcb" T="a#b#c#b" 我们T字符串的每一个T[i]向延伸d个字符 使得 T[i-d,i+d]是一个回文字符串.你会立刻发现,d就是以T[i]为中心的最长回文字符串的长度. 我们建立一个P数组,是的P数组的长度等于T的长度,每一个P[i]的值表示对应的T[i]为中心的最大回文字符串的长度.

【BZOJ-3638&amp;3272&amp;3267&amp;3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广

3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 174  Solved: 92[Submit][Status][Discuss] Description 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. Input The first line contains integer n (1 ≤ n