这完全是回顾以前的知识了...写的时候一些似曾相识的手法渐渐冒出来........- -
然后其实题目都很水....但是看在我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);
}