这完全是回顾以前的知识了...写的时候一些似曾相识的手法渐渐冒出来........- -
然后其实题目都很水....但是看在我WA到现在的份上...贴出来....
HDU 1241
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; inline int Rint() { int x; scanf("%d", &x); return x; } inline int max(int x, int y) { return (x>y)? x: y; } inline int min(int x, int y) { return (x<y)? x: y; } #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define FORD(i,a,b) for(int i=(a);i>=(b);i--) #define REP(x) for(int i=0; i<(x); i++) typedef long long int64; #define INF (1<<30) #define bug(s) cout<<#s<<"="<<s<<" " #define MAXN 102 int G[MAXN*MAXN]; // (x, y) => x+y*m int dx[] = { -1, 0, 1, 0, 1, 1, -1, -1}; int dy[] = { 0, 1, 0, -1, 1, -1, 1, -1}; int vis[MAXN*MAXN]; int q[MAXN*MAXN]; int front, tail; int n, m; void bfs(int st) { //memset(q, 0, sizeof(q)); front = tail = 0; q[tail++] = st; while(front<tail) { int cur = q[front++]; int x = cur%MAXN; int y = cur/MAXN; REP(8) { int tx = x+dx[i]; int ty = y+dy[i]; int now = tx+ty*MAXN; if(G[now] == -1 || G[now] == 1 || vis[now]) continue; vis[now] = 1; q[tail++] = now; } } } int main() { while(m = Rint()) { int ans = 0; n = Rint(); if(m == 0) break; memset(G, -1, sizeof(G)); memset(vis, 0, sizeof(vis)); FOR(i, 1, m) //rows { char buf[MAXN]; scanf("%s", buf); FOR(j, 1, n) { G[j+MAXN*i] = buf[j-1]=='*'? 1: 0; int va = j+MAXN*i; //bug(va); //bug(G[va])<<endl; } } FOR(i, 1, m) //rows FOR(j, 1, n) { int cur = j+i*MAXN; //bug(cur); //bug(G[cur])<<endl; if(!G[cur] && !vis[cur]) { vis[cur] = 1; bfs(cur); ans++; } } printf("%d\n", ans); } }
HDU 2612
晚上真是不能刷太多题, 脑子昏....这题WA到死啊WA到死....
先是放结果(KFC)的数组开小了, 以为只有MAXN, 其实kfc能开遍全图....所以应该是MAXN*MAXN....这RE我都看了半天....
然后是结果数组应该要初始化为INF才行....还是WA...
最后发现'Y' 'M'也是可以走的, 其实就 # 不能走而已.....其实想的时候是对的...写的时候傻逼了下前后弄反了就.....shoot......
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; inline int Rint() { int x; scanf("%d", &x); return x; } inline int max(int x, int y) { return (x>y)? x: y; } inline int min(int x, int y) { return (x<y)? x: y; } #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define FORD(i,a,b) for(int i=(a);i>=(b);i--) #define REP(x) for(int i=0; i<(x); i++) typedef long long int64; #define INF (0xffffff) #define bug(s) cout<<#s<<"="<<s<<" " #define MAXN 210 int G[MAXN*MAXN]; // (x, y) => x+y*m int dx[] = { -1, 0, 1, 0}; int dy[] = { 0, 1, 0, -1}; int vis[MAXN*MAXN]; int fa[MAXN*MAXN]; int q[MAXN*MAXN]; int front, tail; int n, m; int s[2]; //int ret[2][MAXN+3+1000000]; int ret[2][MAXN*MAXN]; int idx; //kfc int cal(int cur) { if(fa[cur]!=cur) return cal(fa[cur])+1; return 0; } void bfs(int st, int id) { fa[st] = st; front = tail = 0; q[tail++] = st; while(front<tail) { int cur = q[front++]; int x = cur%MAXN; int y = cur/MAXN; REP(4) { int tx = x+dx[i]; int ty = y+dy[i]; int now = tx+ty*MAXN; if(G[now] == -1 || vis[now]) continue; if(G[now]>0) //kfc { ret[id][G[now]] = cal(cur)+1; //kfc 可以通过么? //continue; } vis[now] = 1; fa[now] = cur; q[tail++] = now; } } } int main() { while(scanf("%d%d", &n, &m) == 2) { idx = 0; //kfc int si = 0; memset(G, -1, sizeof(G)); FOR(i, 1, n) //rows { char buf[MAXN]; scanf("%s", buf); FOR(j, 1, m) { char t = buf[j-1]; int val = j+MAXN*i; if(t == 'Y' || t == 'M') s[si++] = val; if(t == '@') //>1, kfc { G[val] = ++idx; } else //G[val] = t=='.'? 0: -1; //只有#是不能走的....'Y' 'M'也是可以走的....WA到死......② G[val] = t=='#'? -1: 0; } } //不一定每个kfc都能让两人可以到达....所以ret要初始化...导致wa.....到死....① FOR(j, 1, idx) { REP(2) { ret[i][j] = INF; //实测把这段去掉也可以A....数据弱? } } REP(2) { memset(vis, 0, sizeof(vis)); vis[s[i]] = 1; bfs(s[i], i); } int minx = INF; FOR(i, 1, idx) { //bug(i); //bug(ret[0][i])<<endl; minx = min(ret[0][i]+ret[1][i], minx); } printf("%d\n", 11*minx); } }
POJ 3984
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; inline int Rint() { int x; scanf("%d", &x); return x; } inline int max(int x, int y) { return (x>y)? x: y; } inline int min(int x, int y) { return (x<y)? x: y; } #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define FORD(i,a,b) for(int i=(a);i>=(b);i--) #define REP(x) for(int i=0; i<(x); i++) typedef long long int64; #define INF (1<<30) #define bug(s) cout<<#s<<"="<<s<<" " #define MAXN 8 int G[MAXN*MAXN]; // (x, y) => x+y*m int dx[] = { -1, 0, 1, 0}; int dy[] = { 0, 1, 0, -1}; //int vis[MAXN][MAXN]; int fa[MAXN*MAXN]; int q[MAXN*MAXN]; int front, tail; int m = MAXN; void print(int x, int y) { if(x != 1 || y != 1) { int cur = x+y*m; int now = fa[cur]; int tx = now%m; int ty = now/m; print(tx, ty); } printf("(%d, %d)\n", x-1, y-1); } void bfs(int st) { memset(q, 0, sizeof(q)); memset(fa, 0, sizeof(fa)); front = tail = 0; q[tail++] = st; while(1) { int cur = q[front++]; int x = cur%m; int y = cur/m; if(x == 5 && y == 5) { print(x, y); return; } REP(4) { int tx = x+dx[i]; int ty = y+dy[i]; int now = tx+ty*m; if(G[now] == -1 || G[now] == 1 || fa[now]) continue; fa[now] = cur; q[tail++] = now; } } } int main() { memset(G, -1, sizeof(G)); FOR(i, 1, 5) FOR(j, 1, 5) { G[i+m*j] = Rint(); } bfs(1+1*m); }