The 12th Zhejiang Provincial Collegiate Programming Contest - I Earthstone Keeper浙江省赛
生活随笔
收集整理的這篇文章主要介紹了
The 12th Zhejiang Provincial Collegiate Programming Contest - I Earthstone Keeper浙江省赛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
?
題目:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5501
思路:DFS,用了遞歸就溢出,所以可能得用非遞歸的。把所有可能到達終點的可能路徑都計算,最后比較找最佳。限制條件很多,要細打細算。很煩,不想改了再試,寫了很久了
?
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <map> 5 #include <deque> 6 #include <stack> 7 #include <cstring> 8 #include <algorithm> 9 using namespace std; 10 char dun[505][505]; 11 bool vis[505][505]; 12 struct node 13 { 14 int x,y; 15 int peln,path; //懲罰/ 第幾層 16 int s[55]; //遇到的陷阱,26開始就是A 17 }; 18 stack<node> que; 19 deque<node> anslist; 20 21 int stax, stay; 22 int tarx, tary; 23 int n, m; 24 int fat, mins; 25 26 void init(node &tmp) //初始化怪物標記s 27 { 28 for(int i=0; i<55; i++) 29 tmp.s[i]='0'; 30 } 31 bool tar(node tmp) //判斷是否是目的地 32 { 33 if( tmp.x==tarx && tmp.y==tary ) 34 return true; 35 else 36 return false; 37 } 38 bool cango(node tmp) //判斷能不能走 39 { 40 if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m ) 41 { 42 if( dun[tmp.x][tmp.y]=='#' ) 43 return false; 44 else 45 return true; 46 } 47 else 48 return false; 49 } 50 void adj_mon(node &tmp) //計算怪物懲罰 51 { 52 char c1='0',c2='0',c3='0',c4='0', c5='0'; //走過可能干掉3只怪物 53 54 if( isupper( dun[tmp.x][tmp.y] ) ) //是怪物 55 { 56 c1=dun[tmp.x][tmp.y]; 57 } 58 59 node node1=tmp; 60 node1.x-=1; 61 if( cango(node1)&&isupper( dun[tmp.x-1][tmp.y] ) ) //是怪物 62 { 63 c2=dun[tmp.x-1][tmp.y]; 64 //cout<<"begin"<<endl; 65 } 66 67 node1=tmp; 68 node1.x+=1; 69 if( cango(node1)&&isupper( dun[tmp.x+1][tmp.y] ) ) //是怪物 70 { 71 c3=dun[tmp.x+1][tmp.y]; 72 //cout<<"begin"<<endl; 73 } 74 75 node1=tmp; 76 node1.y+=1; 77 if( cango(node1)&&isupper( dun[tmp.x][tmp.y+1] ) ) //是怪物 78 { 79 c3=dun[tmp.x][tmp.y+1]; 80 //cout<<"begin"<<endl; 81 } 82 83 node1=tmp; 84 node1.y-=1; 85 if( cango(node1)&&isupper( dun[tmp.x][tmp.y-1] ) ) //是怪物 86 { 87 //cout<<"begin"<<endl; 88 c5=dun[tmp.x][tmp.y-1]; 89 } 90 91 //************************************* 92 if(c1!='0'&&tmp.s[ c1-'A'+26 ]=='0') 93 { 94 tmp.s[ c1-'A'+26 ]=true; 95 tmp.peln+=( c1-'A'+1 ); 96 //cout<<"begin"<<endl; 97 } 98 99 if(c2!='0'&&tmp.s[ c2-'A'+26 ]=='0') 100 { 101 tmp.s[ c2-'A'+26 ]=true; 102 tmp.peln+=( c2-'A'+1 ); 103 //cout<<"begin"<<endl; 104 } 105 106 if(c3!='0'&&tmp.s[ c3-'A'+26 ]=='0') 107 { 108 tmp.s[ c3-'A'+26 ]=true; 109 tmp.peln+=(c3-'A'+1); 110 //cout<<"begin"<<endl; 111 } 112 113 if(c4!='0'&&tmp.s[ c4-'A'+26 ]=='0') 114 { 115 tmp.s[ c4-'A'+26 ]=true; 116 tmp.peln+=(c4-'A'+1); 117 //cout<<"begin"<<endl; 118 } 119 120 if(c5!='0'&&tmp.s[ c5-'A'+26 ]=='0') 121 { 122 tmp.s[ c5-'A'+26 ]=true; 123 tmp.peln+= c5-'A'+1; 124 //cout<<"begin"<<endl; 125 } 126 127 128 } 129 void trap(node &tmp) //計算陷阱懲罰 130 { 131 if( islower(dun[tmp.x][tmp.y]) ) //陷阱 132 tmp.peln += (dun[tmp.x][tmp.y] - 'a'+1); 133 } 134 void cal_pel(node &tmp) //計算懲罰 135 { 136 trap(tmp); 137 adj_mon(tmp); 138 } 139 140 int bfs(node tmp) 141 { 142 //判斷四周有沒有能進盞的 143 node node1=tmp; 144 node1.x-=1; 145 if(cango(node1)) //合法 146 { 147 148 cal_pel(node1); 149 node1.path++; 150 if(tar(node1)) 151 anslist.push_back(node1); 152 else if(vis[node1.x][node1.y]==false) //非目的 153 { 154 que.push(node1); 155 vis[node1.x][node1.y]=true; 156 bfs(node1); 157 que.pop(); 158 vis[node1.x][node1.y]=false; 159 160 } 161 162 } 163 164 node1=tmp; 165 node1.x+=1; 166 if(cango(node1)) //合法 167 { 168 cal_pel(node1); node1.path++; 169 if(tar(node1)) 170 anslist.push_back(node1); 171 else if(vis[node1.x][node1.y]==false) //非目的 172 { 173 que.push(node1); 174 vis[node1.x][node1.y]=true; 175 bfs(node1) ; 176 que.pop(); 177 vis[node1.x][node1.y]=false; 178 } 179 } 180 181 node1=tmp; 182 node1.y-=1; 183 if(cango(node1)) //合法 184 { 185 cal_pel(node1); node1.path++; 186 if(tar(node1)) 187 anslist.push_back(node1); 188 else if(vis[node1.x][node1.y]==false) //非目的 189 { 190 que.push(node1); 191 vis[node1.x][node1.y]=true; 192 bfs(node1) ; 193 que.pop(); 194 vis[node1.x][node1.y]=false; 195 } 196 } 197 198 node1=tmp; 199 node1.y+=1; 200 if(cango(node1)) //合法 201 { 202 cal_pel(node1); node1.path++; 203 if(tar(node1)) 204 anslist.push_back(node1); 205 else if(vis[node1.x][node1.y]==false) //非目的 206 { 207 que.push(node1); 208 vis[node1.x][node1.y]=true; 209 bfs(node1) ; 210 que.pop(); 211 vis[node1.x][node1.y]=false; 212 } 213 214 } 215 return 0; 216 } 217 218 int main() 219 { 220 //freopen("input.txt", "r", stdin); 221 int t; 222 cin>>t; 223 while(t--) 224 { 225 anslist.clear(); 226 memset(dun, 0, sizeof(dun)); 227 memset(vis, 0, sizeof(vis)); 228 229 cin>>n>>m; 230 cin>>stax>>stay>>tarx>>tary; 231 stax-=1;stay-=1;tarx-=1;tary-=1; 232 233 234 for(int i=0; i<n; i++) 235 for(int j=0; j<m; j++) 236 cin>>dun[i][j]; 237 238 239 node tmp; 240 init(tmp); 241 tmp.x=stax; tmp.y=stay; tmp.peln=0; tmp.path=0; //起點 242 vis[tmp.x][tmp.y]=true; 243 que.push(tmp); //先進隊 244 bfs(que.top()); 245 246 deque<node>::iterator it=anslist.begin(); 247 int min_path=1247483647; 248 int min_pel=1247483647; 249 for( ; it!=anslist.end(); it++) 250 { 251 //cout<<it->peln<<" "<<it->path<<endl; 252 253 if(it->peln<=min_pel&&it->path<=min_path) 254 { 255 min_pel=it->peln; 256 min_path=it->path; 257 } 258 259 260 } 261 cout<<min_pel<<" "<<min_path<<endl; 262 263 264 265 266 } 267 268 269 return 0; 270 } 遞歸式的,seg錯?
轉載于:https://www.cnblogs.com/xcw0754/p/4456353.html
總結
以上是生活随笔為你收集整理的The 12th Zhejiang Provincial Collegiate Programming Contest - I Earthstone Keeper浙江省赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#扩展方法的理解
- 下一篇: []==![]为true