p1875玉米田bfs解法
  • 板块灌水区
  • 楼主azazele
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/16 17:02
  • 上次更新2024/7/16 18:24:55
查看原帖
p1875玉米田bfs解法
335202
azazele楼主2024/7/16 17:02
#include<cstdio>  
#include<iostream>  
#include<bits/stdc++.h>  
#define go(i,a,b) for(int i=a;i<=b;i++)  
const int mx=100000000;  
using namespace std;  
int m,n,f[13],ans,dp[14][1<<13];  
bool vis[13][1<<13];  
struct node{
	int x,x1,y,d,last;//x放置状态,x1障碍状态,y下一行障碍状态,d深度,last最后放入位置  
	int *val;//每行解值的地址  
	bool operator < (const node&a)const//优先队列,深度浅的优先  
	{
		return d>a.d;
	}
}p;
int bfs(){
	priority_queue<node> q;
	q.push(node{0,f[1],f[2],2,0,&dp[1][f[1]]});//初始化   
	while(!q.empty()){
		p=q.top();
		int now=p.x;int v=p.x1;int next=p.y;int d=p.d;int lt=p.last;int val=*p.val;int *po=p.val;q.pop();//取出
		if(d<=m&&vis[d][next]==0){q.push(node{0,next,f[d+1],d+1,0,&dp[d][next]});vis[d][next]=1;}//换行
		if(now==0)dp[d][next]+=val;//未放置就赋值
		for(int i=(~v)&((1<<n)-1);i!=0;i=i-(i&-i)){
			int x=now,y=next,vv=v;
			int t=log2(i&-i);
			if(t>=lt){ 
				x=x^(1<<t);
				if(t<n-1&&t>=1)vv=vv|(7<<(t-1));
				else if(t==n-1) vv=vv|(3<<(t-1));
				else if(t==0) vv=vv|3;
				y=y|(1<<t);
				dp[d][y]=(dp[d][y]%mx+val%mx)%mx;
				q.push(node{x,vv,y,d,t,po});
			}
		}//位运算判断状态
		
	}
	for(int i=0;i<=((1<<n)-1);i++)ans=(dp[m+1][i]%mx+ans%mx)%mx;//累计答案
	return ans;
}
int main(){
	
	cin>>m>>n;
	go(i,1,m){
		go(j,0,n-1){
			int a;
			cin>>a;
			if(a==0)f[i]=(1<<j)^f[i];
		}
	}//输入
	dp[1][f[1]]=1;//初始化
	cout<<bfs();
	return 0;
}
      
 求加题解
2024/7/16 17:02
加载中...