• 搜索题


    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;
    }
    
  • 相关阅读:
    为 DropDownList 选项添加背景或样式
    杂七杂八——Name与x:Name的关系
    原创Godaddy帐户取消信用卡或PayPla绑定,防止无端扣费[图文教程]
    dota中名词解释
    在 JavaScript 中如何创建多行字符串(JavaScript Multiline String)
    HDU 4035 Maze(概率DP)
    获取想要得到的风格设计属性描述————Resources.Theme类函数public TypedArray obtainStyledAttributes()
    Android 异步更新UI —— Handler 【复杂的数据操作另起新线程然后在当前UI线程更新结果】
    超链接中文乱码问题
    java中的final变量
  • 原文地址:https://www.cnblogs.com/w-w-t/p/12240621.html
Copyright © 2020-2023  润新知