#include#includeusingnamespacestd;typedeflonglongll;structH{staticconstintM=799997;struc" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

【FZU】1977 Pandora adventure

系統 2328 0

http://acm.fzu.edu.cn/problem.php?pid=1977

題意:n×m的網格,有3種格子,'O'必須經過、'*'可以選擇經過、'X'不能經過。現在要求路徑經過所有'O'且是簡單回路的數量

      #include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;



typedef long long ll;

struct H {

	static const int M=799997;

	struct E { int next, to; }e[M];

	int ihead, cnt, hash[M];

	ll sum[M];

	H() { ihead=cnt=0; memset(hash, -1, sizeof hash); memset(sum, 0, sizeof sum); }

	bool find(int x, int &pos) {

		pos=x%M;

		while(1) { if(hash[pos]==x) return false; if(hash[pos]==-1) break; ++pos; if(pos==M) pos=0; }

		hash[pos]=x; return true;

	}

	void ins(int a, ll b) {

		int pos; if(!find(a, pos)) { sum[pos]+=b; return; }

		e[++cnt].next=ihead; ihead=cnt; e[cnt].to=pos; sum[pos]=b;

	}

	void clr() { for(int i=ihead; i; i=e[i].next) hash[e[i].to]=-1, sum[e[i].to]=0; ihead=cnt=0; }

}T1, T2;



#define BIT(a,b) ((a)<<((b)<<1))

#define CLR(a,b) (a^=((a)&BIT(3,b)))

#define GET(a,b) (3&((a)>>((b)<<1)))



const int N=15;

int n, m, all;

ll ans;

int mp[N][N];



int find(int s, int col, int flag) {

	int sum=0;

	if(flag) {

		for(int i=col; i<=m; ++i) {

			int k=GET(s, i);

			if(k==1) ++sum;

			if(k==2) --sum;

			if(!sum) return i;

		}

	}

	else {

		for(int i=col; i>=0; --i) {

			int k=GET(s, i);

			if(k==1) --sum;

			if(k==2) ++sum;

			if(!sum) return i;

		}

	}

	return -1;

}

void print(int s) {

	for(int i=0; i<=m; ++i) { int k=GET(s, i); if(k==0) putchar('#'); else if(k==1) putchar('('); else if(k==2) putchar(')');  }

	puts("");

}

#define F puts("error");

bool next(int s, int row, int col, bool U, bool D, bool L, bool R, int &t) {

	if((row==n-1&&D) || (row==0&&U) || (col==m-1&&R) || (col==0&&L)) return 0;

	if((D&&!mp[row+1][col]) || (R&&!mp[row][col+1])) return 0;

	int l=GET(s, col), u=GET(s, col+1), flag=GET(s, m+1), d=0, r=0;

	if((l&&!L) || (!l&&L) || (u&&!U) || (!u&&U)) return 0;

	// printf("State:"); print(s);

	// printf("row:%d, col:%d, U:%d, D:%d, L:%d, R:%d ", row, col, U, D, L, R);

	// printf(" left:"); if(l==1) printf("("); if(l==2) printf(")"); if(l==0) printf("#");

	// printf(" uptp:"); if(u==1) printf("("); if(u==2) printf(")"); if(u==0) printf("#"); puts("");

	t=s;

	CLR(t, col);

	CLR(t, col+1);

	if(!l && !u) {

		if(R && D) d=1, r=2;

	}

	else if(l && u) {

		if(l==1 && u==1) {

			int pos=find(s, col+1, 1);

			CLR(t, pos);

			t|=BIT(1, pos);

		}

		else if(l==2 && u==2) {

			int pos=find(s, col, 0);

			CLR(t, pos);

			t|=BIT(2, pos);

		}

		else if(l==1 && u==2) flag=1;

	}

	else if(l && !u) {

		if(D) d=l, r=0;

		if(R) d=0, r=l;

	}

	else if(!l && u) {

		if(D) d=u, r=0;

		if(R) d=0, r=u;

	}

	t|=BIT(d, col);

	t|=BIT(r, col+1);

	if(col==m-1) t<<=2; //puts("=============\nnext");  print(t);

	t&=all;

	if(flag) t|=BIT(1, m+1);

	return 1;

}



void bfs() {

	H *q1, *q2;

	q1=&T1; q2=&T2;

	q1->clr();

	q2->clr();

	q1->ins(0, 1);

	for(int row=0; row<n; ++row) for(int col=0; col<m; ++col) {

		q2->clr(); //printf("q1->cnt:%d\n", q1->cnt);

		for(int i=q1->ihead; i; i=q1->e[i].next) {

			int s=q1->hash[q1->e[i].to], t, flag=GET(s, m+1); //print(s);

			ll sum=q1->sum[q1->e[i].to];

			if(mp[row][col]==2 && flag) continue;

			if(mp[row][col]<=1) { if(next(s, row, col, 0, 0, 0, 0, t)) q2->ins(t, sum); }

			if(mp[row][col]>=1 && !flag) { //忘記判flag又調了好久...

				if(next(s, row, col, 1, 1, 0, 0, t)) q2->ins(t, sum);

				if(next(s, row, col, 1, 0, 1, 0, t)) q2->ins(t, sum);

				if(next(s, row, col, 1, 0, 0, 1, t)) q2->ins(t, sum);

				if(next(s, row, col, 0, 1, 1, 0, t)) q2->ins(t, sum);

				if(next(s, row, col, 0, 1, 0, 1, t)) q2->ins(t, sum);

				if(next(s, row, col, 0, 0, 1, 1, t)) q2->ins(t, sum);

			}

		}

		swap(q1, q2);

	}

	for(int i=q1->ihead; i; i=q1->e[i].next) ans+=q1->sum[q1->e[i].to];

}



int main() {

	int cs; scanf("%d", &cs);

	char s[N];

	for(int cc=1; cc<=cs; ++cc) {

		ans=0;

		scanf("%d%d", &n, &m); all=BIT(1, m+1)-1;

		for(int i=0; i<n; ++i) {

			scanf("%s", s);

			for(int j=0; j<m; ++j) {

				if(s[j]=='*') mp[i][j]=1;

				else if(s[j]=='O') mp[i][j]=2;

				else mp[i][j]=0;

			}

		}

		bfs();

		printf("Case %d: %I64d\n", cc, ans);

	}

	return 0;

}


    


?

今天犯逗技能開到max?

竟然沒有考慮已經有環了不需要再拓展狀態的情況QAQ

本題其實就是模板題。只不過我們并不知道環在哪里被鏈接,因此我們再開一個狀態表示當前輪廓線是否已經是環。

【FZU】1977 Pandora adventure


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91麻豆国产极品在线观看洋子 | 久久婷婷综合中文字幕 | 亚洲h视频 | 在线免费国产 | 国产目拍亚洲精品99久久精品 | 免费在线国产视频 | 欧美a级成人淫片免费看 | 99午夜高清在线视频在观看 | 欧美视频第一区 | 中国明星一级毛片免费 | 日本午夜免费无码片三汲大片 | 中国一级黄色片 | 国产www色 | 狠狠干美女 | 少妇特黄a一区二区三区88av | 91麻豆蜜桃一区二区三区 | 久草影视网 | 欧美日韩中文字幕 | 欧美日韩中字 | 日本精高清区一 | 欧美精品免费线视频观看视频 | 亚洲一二三区视频 | 日韩福利视频一区 | 国产精品视频免费的 | 免费很黄很色裸乳在线观看 | 国产自产拍精品视频免费看 | 精品一区亚洲 | 排球少年第四季樱花动漫 | 日韩欧美一区二区三区四区 | 亚洲欧美精品综合中文字幕 | 午夜黄色影院 | 97色在线 | 成人午夜AV亚洲精品无码网站 | 亚洲精品久久久久久一区二区 | 色综合亚洲精品激情狠狠 | 日日爽 | 日韩精品一区二区三区四区视频 | 国产成久久免费精品AV片天堂 | 污视频在线免费观看 | 白天操夜夜操 | 久草国产视频 |