poj1321 棋盘问题
描述:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
例如:
4 4 ...# ..#. .#.. #... 只有一种方案
解决方案:dfs 从下至下 遍历每一行,选取改行后者不选取改行
code:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,k; int cnt,num; char map[10][10]; bool place[10]; void dfs(int i)//第i行 { int j; if(k==num){ cnt++; return; } if(i>=n)return; for(j=0;j<n;j++) { if(!place[j]&&map[i][j]=='#') { place[j]=true; num++; dfs(i+1); place[j]=false; num--; } } dfs(i+1);//不选第i行 } int main() { while(~scanf("%d%d",&n,&k)) { if(n==-1&&k==-1)break; int i; cnt=0; num=0; memset(place,false,sizeof(place)); for(i=0;i<n;i++)scanf("%s",map[i]); dfs(0); printf("%d\n",cnt); } return 0; }
poj 2251 Dungeon Master
描述:三维迷宫
例如:
1 3 3 S## #E# ###
一层的3*3的迷宫,S起点 E终点 #墙 .路,没有通路
解决:分north, south, east, west, up or down. 六个方向广搜
code:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct Point { int x,y,z; int step; Point(){} Point(int _x,int _y,int _z,int _step):x(_x),y(_y),z(_z),step(_step){} }; int L,R,C; queue<Point>q; char map[50][50][50];//z x y bool vis[50][50][50]; int sx,sy,sz,ex,ey,ez; int f[6][3]={{0,-1,0},{0,1,0},{0,0,-1},{0,0,1},{1,0,0},{-1,0,0}};//L,R,C north, south, east, west, up or down. bool flag; void bfs() { int x,y,z,i; flag=false; while(!q.empty())q.pop(); memset(vis,false,sizeof(vis)); q.push(Point(sx,sy,sz,0)); vis[sz][sx][sy]=true; while(!q.empty()){ Point t; memcpy(&t,&q.front(),sizeof(t)); q.pop(); // printf("** %d %d %d %d\n",t.x,t.y,t.z,t.step); if(t.x==ex&&t.y==ey&&t.z==ez){ printf("Escaped in %d minute(s).\n",t.step); flag=true; return; } for(i=0;i<6;i++) { x=t.x+f[i][1]; y=t.y+f[i][2]; z=t.z+f[i][0]; if(x>=0&&x<R&&y>=0&&y<C&&z>=0&&z<L&&!vis[z][x][y]&&map[z][x][y]!='#') { vis[z][x][y]=true; q.push(Point(x,y,z,t.step+1)); } } } } int main() { while(~scanf("%d%d%d",&L,&R,&C)) { int k,i,j; if(L==0&&R==0&&C==0)break; for(k=0;k<L;k++) { for(i=0;i<R;i++) { scanf("%s",map[k][i]); for(j=0;j<C;j++) { if(map[k][i][j]=='S') { sx=i; sy=j; sz=k; } if(map[k][i][j]=='E') { ex=i; ey=j; ez=k; } } } } bfs(); if(flag==false)puts("Trapped!"); } return 0; }