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;
}