搜索题

1. POJ-1321

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,
请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

初始想法(wa

book[MA]//该行是否放棋子
单纯考虑在n行中取k行放棋子,以为就是一个组合问题,题意没理解就做了。
没有考虑若一行有两个'#'位置的情况,所以应该双层for循环判断每一个位置是否为'#'就好了。
for(int j=i;j<n;j++)
    for(int t=0;t<n;t++)
        if(book[j]==0&&a[j][t]=='#'){
      
        }

第二次(wa

没有考虑列的问题,大失误。加一个row[MA]存各列的状态

第三次(ac

#include<iostream>
#include<cstring>
using namespace std;
const int MA=10;
int n,k;
long long sum;
char a[MA][MA];
int book[MA];//这行是否放置棋子 
int row[MA];

void dfs(int i,int m){//第m个棋子放在 i 到 n-1 的任一满足条件行  
	if(m==k+1){
		sum++;
		return ;
	}
	for(int j=i;j<n;j++){
		for(int t=0;t<n;t++){
			if(book[j]==0&&a[j][t]=='#'&&row[t]==0){
				row[t]=1;
				book[j]=1;
				dfs(j+1,m+1);
				book[j]=0;
				row[t]=0;
			}
		}
	}
}
int main(){
	while(cin>>n>>k){
		if(n==-1&&k==-1)break;
		memset(book,0,sizeof(book));
		memset(row,0,sizeof(row));
		sum=0;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				cin>>a[i][j];
			}
		}
		dfs(0,1);
		cout<<sum<<endl;
	}
	return 0;
}

2.POJ-2251 Dungeon Master

超经典bfs问题,以前做过,记住要清空队列QAQ
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MA=35;
int L,R,C;            //L为层数,R为行数,C为列数
int x0,y0,z0,x1,y1,z1;//起点坐标,终点坐标 
char a[MA][MA][MA];    //地图 
int book[MA][MA][MA];
int place[6][3]={{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};
struct node{
	int x;
	int y;
	int z;
	int s;
}st;
queue<node> q;//队列
bool bfs(){
	struct node v1;
	while(!q.empty()){
		v1=q.front();//取头结点,并修改其周围的状态 
		q.pop();
		for(int i=0;i<6;i++){
			int tx,ty,tz;
			tx=v1.x+place[i][0];
			ty=v1.y+place[i][1];
			tz=v1.z+place[i][2];
			if(tx>=0&&tx<R&&ty>=0&&ty<C&&tz>=0&&tz<L&&a[tx][ty][tz]!='#'&&book[tx][ty][tz]==0){
				st.x=tx;
				st.y=ty;
				st.z=tz;
				st.s=v1.s+1;
				book[tx][ty][tz]=1;
				q.push(st);
			}
			if(tx==x1&&ty==y1&&tz==z1)return true;
		}
	}
	return false;
}
int main(){
	while(cin>>L>>R>>C){
		if(L==0&&R==0&&C==0)break;
		while(!q.empty())q.pop();//清空队列
		memset(book,0,sizeof(book)); 
		for(int k=0;k<L;k++)             //存入地图 
			for(int i=0;i<R;i++)
				for(int j=0;j<C;j++){
					cin>>a[i][j][k];
					if(a[i][j][k]=='S') x0=i,y0=j,z0=k;
					else if(a[i][j][k]=='E') x1=i,y1=j,z1=k;
				}
		st.x=x0,st.y=y0,st.z=z0,st.s=0;
		book[x0][y0][z0]=1;
		q.push(st);                  //将起点放入队列 
		if(bfs()){
			st=q.back();
			cout<<"Escaped in "<<st.s<<" minute(s)."<<endl;
		}
		else cout<<"Trapped!"<<endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/w-w-t/p/12240621.html