第四次
来源:互联网 发布:农村淘宝发展前景分析 编辑:程序博客网 时间:2024/06/10 06:14
http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2101&pid=6
题意:
狗追小偷,如果找到了他的足迹,则速度变为原来2倍,有若干个出口,问最后小偷能否顺利逃脱。
思路:
枚举每一个出口,从小偷开始bfs,如果下一个点满足条件(小偷到这个点的距离+到出口距离<狗到这个点距离+到出口距离+1 /2) 则可以转移,如果能转移到出口则可以逃脱~
#include <stdio.h>int grid_width, grid_height;char grid_sym[2510];int grid_dist_kennel[2500];int grid_dist_thief[2500];int grid_dist_exit[2500];int exits[200];#define FFQC 2510int ffq_pop_idx = 0, ffq_push_idx = 0;int ffqp[FFQC], ffqd[FFQC];void ffq_push(int pos, int depth) { ffqp[ffq_push_idx] = pos; ffqd[ffq_push_idx] = depth; ffq_push_idx = (ffq_push_idx + 1) % FFQC;}int ffq_pop(int *pos, int *depth) { if (ffq_pop_idx == ffq_push_idx) return 0; *pos = ffqp[ffq_pop_idx]; *depth = ffqd[ffq_pop_idx]; ffq_pop_idx = (ffq_pop_idx + 1) % FFQC; return 1;}void flood_fill(int start_pos, int *distances, int(*should_visit)(int, int)) { for (int i = 0; i < 2500; ++i) { distances[i] = -1; } ffq_push(start_pos, 0); int pos, depth; while (ffq_pop(&pos, &depth)) { if (distances[pos] == -1 && grid_sym[pos] != 'X' && should_visit(pos, depth)) { distances[pos] = depth; const int row = pos / grid_width; const int col = pos % grid_width; if (row > 0) ffq_push(pos - grid_width, depth + 1); if (col > 0) ffq_push(pos - 1, depth + 1); if (col + 1 < grid_width) ffq_push(pos + 1, depth + 1); if (row + 1 < grid_height) ffq_push(pos + grid_width, depth + 1); } }}int should_visit_thief(int pos, int depth) { const int thief_exit_time = depth + grid_dist_exit[pos]; const int dog_exit_time = grid_dist_kennel[pos] + (grid_dist_exit[pos] + 1) / 2; return thief_exit_time < dog_exit_time;}int should_visit_other(int pos, int depth) { return 1;}void handle_case() { int thief, kennel, num_exits = 0; for (int i = grid_width * grid_height; i > 0; --i) { switch (grid_sym[i]) { case 'T': thief = i; break; case 'K': kennel = i; break; case 'E': exits[num_exits++] = i; } } flood_fill(kennel, grid_dist_kennel, should_visit_other); for (int i = 0; i < num_exits; ++i) { flood_fill(exits[i], grid_dist_exit, should_visit_other); flood_fill(thief, grid_dist_thief, should_visit_thief); if (grid_dist_thief[exits[i]] >= 0) { puts("KEEP IT"); return; } } puts("DROP IT");}int main() { while (scanf("%d %d ", &grid_width, &grid_height) == 2 && grid_width >= 3 && grid_height >= 3) { for (int row = 0; row < grid_height; ++row) { fgets(&grid_sym[row * grid_width], 60, stdin); } handle_case(); }}
http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2101&pid=0
题意: 一棵满二叉树代表一个家谱,定义几种成员关系,任意给定2个序号和b的性别,问a和b的关系。
找到最近公共祖先,根据a 到最近公共祖先的距离和a与b的距离之差即可判断出到底是什么关系,最近公共祖先只要找规律去求即可~
#include <stdio.h>char *nth[] = {"1st", "2nd", "3rd"};char *removed[] = {"once", "twice", "thrice"};#define MF(m, f) sex == 'M' ? m : fvoid handle_case(int id_a, int id_b, char sex) { int dist_a = 0, dist_b = 0; while (id_a != id_b) { if (id_a > id_b) dist_a++, id_a = (id_a - 1) / 2; else dist_b++, id_b = (id_b - 1) / 2; } int smaller = dist_a < dist_b ? dist_a : dist_b; int delta = dist_a - smaller + dist_b - smaller; if (dist_a == 0 && dist_b == 0) { puts("self"); } else if (dist_a == 1 && dist_b == 1) { puts(MF("brother", "sister")); } else if (smaller <= 1 && delta <= 4) { switch (delta) { case 4: fputs("great-", stdout); case 3: fputs("great-", stdout); case 2: fputs("grand", stdout); } if (dist_a == 0) puts(MF("son", "daughter")); else if (dist_b == 0) puts(MF("father", "mother")); else if (dist_a == 1) puts(MF("nephew", "niece")); else puts(MF("uncle", "aunt")); } else if (smaller >= 2 && smaller <= 4 && delta <= 3) { if (delta == 0) printf("%s cousin\n", nth[smaller - 2]); else printf("%s cousin %s removed\n", nth[smaller - 2], removed[delta - 1]); } else { puts("kin"); }}int main(int argc, char** argv) { int id_a, id_b; char sex; while (scanf("%d %d %c", &id_a, &id_b, &sex) && id_a >= 0) { handle_case(id_a, id_b, sex); } return 0;}
B:二分答案
#include <math.h>#include <stdio.h>int main() { double pi = acos(-1); double precision = 0.00001 * pi / 180; double d, h, x, n1, n2; while (scanf("%lf %lf %lf %lf %lf", &d, &h, &x, &n1, &n2) && d) { double phi_min = 0; double phi_max = pi / 2; while (phi_max - phi_min > precision) { double phi = (phi_min + phi_max) / 2; double theta1 = pi / 2 - phi; double theta2 = asin(n2 * sin(theta1) / n1); if (d * tan(theta1) + h * tan(theta2) > x) { phi_min = phi; } else { phi_max = phi; } } printf("%0.02lf\n", phi_min * 180 / pi); }}
暴力,注意字典序的排序方法以及字符串从1开始的递归终止条件是>长度 !!!!!
#include <bits/stdc++.h>using namespace std;char d[250][30],s[10][10];int w,dd;char m[10][10];int dir[8][2]={1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1};struct Geng{ char s[30];}ans[250];bool cmp(Geng g1,Geng g2){ int l = 0; for(int i = 0 ; g1.s[i] != '\0' && g2.s[i] != '\0' ; i++) { if(g1.s[i] != g2.s[i]) return g1.s[i] < g2.s[i]; l = i; } int l1, l2; l1 = l2 = l + 1; if(g1.s[l + 1] != '\0') l1++; if(g2.s[l + 1] != '\0') l2++; return l1 < l2;}int find(char s[10][10],char *d,int x,int y,int pos){ if(pos>strlen(d+1)){ return 1; } char now=s[x][y]; s[x][y]='0'; for(int i=0;i<8;i++){ int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(s[nx][ny]=='q'){ if(strlen(d+pos)>=2&&d[pos]=='q'&&d[pos+1]=='u'){ if(find(s,d,nx,ny,pos+2)){ return 1; } } } else if(s[nx][ny]==d[pos]){ if(find(s,d,nx,ny,pos+1)){ return 1; } } } s[x][y]=now; return 0;}int main(){ scanf("%d",&w); for(int i=1;i<=w;i++){ scanf("%s",d[i]+1); } while(scanf("%d",&dd)!=EOF){ if(dd==0) break; for(int i=0;i<=8;i++){ for(int j=0;j<=8;j++){ s[i][j]='0'; } } for(int i=1;i<=dd;i++){ scanf("%s",s[i]+1); } for(int i=1;i<=dd;i++){ for(int j=1;j<=strlen(s[i]+1);j++){ m[i][j]=s[i][j]; } } int kk=0; for(int i=1;i<=w;i++){ int flag=0; for(int j=1;j<=dd;j++){ for(int k=1;k<=dd;k++){ if(s[j][k]=='q'){ if(strlen(d[i]+1)>=2&&d[i][1]=='q'&&d[i][2]=='u'){ for(int i1=1;i1<=dd;i1++){ for(int j1=1;j1<=strlen(s[i1]+1);j1++){ m[i1][j1]=s[i1][j1]; } } if(find(m,d[i],j,k,3)){ strcpy(ans[kk++].s,d[i]+1);flag=1;break; } } } else if(s[j][k]==d[i][1]){ for(int i1=1;i1<=dd;i1++){ for(int j1=1;j1<=strlen(s[i1]+1);j1++){ m[i1][j1]=s[i1][j1]; } } if(find(m,d[i],j,k,2)){ strcpy(ans[kk++].s,d[i]+1);flag=1;break; } } } if(flag) break; } }// for(int i = 0 ; i < kk ; i++) printf("%s\n", ans[i].s);// rp sort(ans,ans+kk,cmp); for(int i=0;i<kk;i++){ printf("%s\n",ans[i].s); } puts("-"); }}/*1rprquit5rpritahqlnietepzrysgogwey0*//************************************************************** Problem: 1719 User: ALPC_t_1 Language: C++ Result: Accepted Time:0 ms Memory:1508 kb****************************************************************/
没想到这题用string写还是蛮方便的,直接暴力查询就好了,不用像char那样先匹配到一起,然后再整体比对,substr函数第一个是首指针,第二个是长度,可以直接取出来这个substr 判断是不是与字典相等即可~~
#include <bits/stdc++.h>using namespace std;const int MAXN = 300;const int MAXM = 1000 + 5;int m;string allot[MAXM];map<char, string> ma;char str1[MAXM];string str2;void init(){ ma.clear(); for(int i = 0 ; i < 26 ; i++) { char u = i + 'A'; scanf("%s", str1); cin>>str2; ma[u] = str2; } scanf("%d", &m); for(int i = 0 ; i < m ; i++) cin >> allot[i];}string data[MAXM];string out[MAXM];string match(string u){ for(int i = 0 ; i < m ; i++) { int ok = 1; int now = 0; for(int j = 0 ; j < allot[i].size() ; j++) { int len = ma[allot[i][j]].size(); if(u.substr(now, len) != ma[allot[i][j]]) { ok = 0; break; } else now += len; if(now > u.size()) { ok = 0; break; } } if(now != u.size()) ok = 0; if(ok == 1) return allot[i]; } return "-1";}int main(){ init(); int n; while(scanf("%d", &n) != EOF && n) { int flag = 1; int pos; for(int i = 0 ; i < n ; i++) { cin >> data[i]; out[i] = match(data[i]); if(out[i] == "-1") { if(flag == 1) { pos = i; flag = 0; } } } if(flag == 0) { cout << data[pos] << " not in dictionary.\n"; continue; } for(int i = 0 ; i < n ; i++) { if(i) cout << " "; cout << out[i] ; } printf("\n"); } return 0;}
0 0
- 第四次
- 第四次
- 第四次
- 第四次
- 第四次培训
- 第四次失业浪潮
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业哦~~~~
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 网络请求时遇到的,写给自己看的,如有错误可以提出,请勿批判
- JSP基本原理
- MVC和MVP的区别
- Android 环境变量配置
- Maven2的配置文件settings.xml
- 第四次
- 贪心1012
- STM32 PC13 PC14 PC15 驱动LED配置
- Minimum Window Substring
- mybaits generator自动生成model、xml、dao
- Qt中如何给生成的可执行文件设置图标
- 如何快速掌握一门新技术/语言/框架
- 在ubuntu10.04下 GStreamer开发环境搭建
- 多线程:NSOperation 的基本使用