深度优先搜索
跟着林总走。
POJ 1979 Red and Black
简单递归,求能走过的可达总点数。
‘.’ - a black tile 可达
‘#’ - a red tile 不可回溯
‘@’ - a man on a black tile(appears exactly once in a data set) 起始点
#include <stdio.h>
char wall[21][21];
int sum=0,m,n,i,j;
char w;
void dfs(int a,int b)//挨个函数调用
{
if(wall[a][b]=='#')//碰到墙
return;
if(a>m-1||a<0&&b>n-1||b<0)//超出边界
return;
sum++;
wall[a][b]='#';//走过的标记成墙
dfs(a+1,b);//上下左右各扩展一步
dfs(a,b+1);
dfs(a-1,b);
dfs(a,b-1);
}
int main()
{
int a,b;
while(scanf("%d%d",&m,&n),m||n)
{
for(i=0;i<m;i++)
{
getchar();//可以利用getchar()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面
//也可以吃换行符吧
//百度完才理解林总嫌弃的眼神
for(j=0;j<n;j++)
{
scanf("%c",&w);
wall[i][j]=w;
if(w=='@')//遇到起始点,开始
{
a=i;
b=j;
}
}
}
dfs(a,b);
printf("%d",sum);
}
return 0;
}
HDU 2553 N皇后问题
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
int sum=0;//计数用
int a[22],N;//计算N = 1~21皇后的不同放置数量,然后打表
int ans[22];//ans for answer
int canplace(int row)//row表示一行row列
{
for(int i=0;i<row;i++)
{
if((abs(row-i)==abs(a[row]-a[i]))||a[row]==a[i])//对角线和列
return 0;
else
return 1;
}
}
void queen(int row)//row表示第row行
{
for(int i=0;i<N;i++)//从头开始
{
a[row]=i;//试探当前行的每一个位置
if(canplace(row))//如果这一行的row位置可以放
queen(row+1);//那就下一行
if(row==N)
sum++;//到头了,count住一种方法
}
}
void main()
{
int i,m;
for(i=0;i<22;i++)
{
//sum=0;
N=i;
queen(0);
ans[i]=sum;
}
while(scanf("%d",&N)&&N)
printf("%d",ans[N]);
//getchar();
}