这完全是回顾以前的知识了...写的时候一些似曾相识的手法渐渐冒出来........- -

然后其实题目都很水....但是看在我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);
}