一、简介
初现-迷宫问题
#include<iostream>
#include<string>
using namespace std;
int n,m;
string maze[110];
bool vis[110][110];
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool in(int x,int y){
return x>=0 && x<n && y>=0 && y<m;
}
bool dfs(int x,int y){
if(maze[x][y]=='T'){
return true;
}
vis[x][y] = 1; //已走过
maze[x][y]='m';//走过的路
for(int i=0;i<4;i++)
{
int tx=x+dir[i][0];
int ty=x+dir[i][1];
if(in(tx,ty) && maze[tx][ty]!='*' && !vis[tx][ty])
{
if(dfs(tx,ty)){
return true;
}
}
}
vis[x][y]=0;
maze[x][y]='.';
return false;
}
int main()
{
//输入迷宫地图
cin >> n >> m;
for(int i=0;i<n;i++){
cin>>maze[i];
}
int x, y;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
{
if(maze[i][j]=='S')
{
x=i,y=j;
}
}
}
if(dfs(x,y)){
for(int i=0;i<n;i++)
{
cout<<maze[i]<<endl;
}
}else{
cout<<"NO!"<<endl;
}
return 0;
}
象棋问题
#include<iostream>
using namespace std;
char s[10][10];
int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
bool f;
bool vis[10][10];
int tx,ty;
bool in(int x,int y){
return x>=0 && x<10 && y>=0 && y<9;
}
bool dfs(int x,int y){
if(s[x][y]=='T')
{
return true;
}
vis[x][y]=true;
for(int i=0;i<8;i++)
{
int tx=x+dir[i][0];
int ty=x+dir[i][1];
if(in(tx,ty) && s[tx][ty]!='#' && !vis[tx][ty])
{
if(dfs(tx,ty)){
return true;
}
}
}
vis[x][y]=false;
}
int main(){
int x,y;//记录初始化位置
for(int i=0;i<10;i++){
for(int j=0;j<9;j++){
cin>>s[i][j];
}
}
for(int i=0;i<10;i++){
for(int j=0;j<9;j++){
if(s[i][j]=='S'){
x=i;
y=j;
}
}
}
if(dfs(x,y)){
cout<<"yes"<<endl;
}else{
cout<<"no"<<endl;
}
}
迷宫重塑
#include<iostream>
#include<string>
using namespace std;
int n,m;
int ans=1000000000;
string maze[110];
bool vis[110][110];
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool in(int x,int y){
return x>=0 && x<n && y>=0 && y<m;
}
void dfs(int x,int y,int step){
if(maze[x][y]=='T'){
if(step<ans){
ans=step;
}
return ;
}
vis[x][y] = 1; //已走过
for(int i=0;i<4;i++)
{
int tx=x+dir[i][0];
int ty=x+dir[i][1];
if(in(tx,ty) && maze[tx][ty]!='*' && !vis[tx][ty])
{
dfs(tx,ty,step + 1);
}
}
vis[x][y]=0;
}
int main()
{
//输入迷宫地图
cin >> n >> m;
for(int i=0;i<n;i++){
cin>>maze[i];
}
int x, y;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
{
if(maze[i][j]=='S')
{
x=i,y=j;
}
}
}
dfs(x,y,0);
cout<<ans<<endl;
return 0;
}
二、练习题
踏青
#include<iostream>
#include<cstdio>
using namespace std;
char map[105][105];
bool vis[105][105];
int n,m;
void dfs(int x,int y){
if(x<0 || x>=n || y<0 || y>=m || vis[x][y] || map[x][y]=='.'){
return;
}
vis[x][y] =true;
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
}
int main(){
int cnt=0;
cin>>n>>m;
for(int i=0;i<n;i++){
scanf("%s",map[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!vis[i][j] && map[i][j] == '#'){
dfs(i,j);//把这个没被访问的草丛访问
cnt++;
}
}
}
cout<<cnt<<endl;
}
迷宫解得方案数
#include<iostream>
#include<cstdio>
using namespace std;
bool vis[15][15]={false};
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int n,m;
char map[15][15];
int cnt=0;
bool in(int x,int y){
return x>=0 && x<n && y>=0 && y<m;
}
void dfs(int x,int y){
if(map[x][y]=='e'){
cnt++;
return ;
}
vis[x][y]=true;
for(int i=0;i<4;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(in(tx,ty) && map[tx][ty]!='#' && !vis[tx][ty])
{
dfs(tx,ty);
}
}
vis[x][y]=false;
}
int main()
{
int x,y;
cin>>n>>m;
for(int i=0;i<m;i++)
{
scanf("%s",map[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='s'){
x=i;y=j;
}
}
}
dfs(x,y);
cout<<cnt<<endl;
return 0;
}
最大的蛋糕块
类似于上题的踏青:
#include<iostream>
#include<cstdio>
using namespace std;
bool vis[15][15]={false};
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int n,m;
char map[15][15];
int cnt=0;
int ans=0;
bool in(int x,int y){
return x>=0 && x<n && y>=0 && y<m;
}
void dfs(int x,int y){
cnt++;
vis[x][y]=true;
for(int i=0;i<4;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(in(tx,ty) && map[tx][ty]!='.' && !vis[tx][ty])
{
dfs(tx,ty);
}
}
}
int main()
{
int x,y;
cin>>n>>m;
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!vis[i][j] && map[i][j]=='#'){
cnt=0;
dfs(i,j);
if(cnt>ans){
ans=cnt;
}
}
}
}
cout<<ans<<endl;
return 0;
}
家谱
象棋
王子救公主
开公司
#include<iostream>
using namespace std;
int task[15][15];
bool used[15];
int ans;
int n;
void dfs(int x,int t){
if(x == n){
if(t<ans){
ans=t;
}
return ;
}
for(int i=0;i<n;i++){
if(!used[i]){
used[i]=true;
dfs(x+1,t+task[x][i]);
used[i]=false;
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>task[i][j];
}
}
ans=2000000;
dfs(0,0);
cout<<ans<<endl;
return 0;
}