1006.堡垒问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
城堡是一个4×4的方格,为了保卫城堡,现需要在某些格子里修建一些堡垒。城堡中的某些格子是墙,其余格子都是空格,堡垒只能建在空格里,每个堡垒都可以向上下左右四个方向射击,如果两个堡垒在同一行或同一列,且中间没有墙相隔,则两个堡垒都会把对方打掉。问对于给定的一种状态,最多能够修建几个堡垒。
输入
每个测例以一个整数n(1<=n<=4)开始,表示城堡的大小。接下来是n行字符每行n个,‘X’表示该位置是墙,‘.’表示该位置是空格。n等于0标志输入结束。
输出
每个测例在单独的一行输出一个整数:最多修建堡垒的个数。
输入样例
4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0
输出样例
5
1
5
2
4
//X表示墙 .表示该位置是空格
//如果两个堡垒在同一行或者是同一列,并且中间没有墙相隔,则不能共存
//上下左右四个方向射击
//4*4的方格
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
char a[5][5];
int book[5][5];
int num;
int maxh;
int canset(int x,int y)
{
if(book[x][y]!=0)return 0;//代表该点处不可放
for(int i=x;i>=1;i--)
{
if(book[i][y]==2)break;//代表有墙
if(book[i][y]==1)return 0;//代表遇到了堡垒
}
for(int i=x;i<=n;i++)
{
if(book[i][y]==2)break;
if(book[i][y]==1)return 0;
}
for(int i=y;i>=1;i--)
{
if(book[x][i]==2)break;
if(book[x][i]==1)return 0;
}
for(int i=y;i<=n;i++)
{
if(book[x][i]==2)break;
if(book[x][i]==1)return 0;
}
return 1;
}
void dfs(int num)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(canset(i,j))
{
book[i][j]=1;
dfs(num+1);
book[i][j]=0;
}
}
if(num>maxh)//不能再放置了
{
maxh=num;
}
}
int main()
{
while(cin>>n)
{
if(n==0)break;
memset(book,0,sizeof(book));//初始化为0 表示为空格
memset(a,0,sizeof(a));
maxh=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]=='X')
{
book[i][j]=2;//代表是墙
}
}
dfs(0);
cout<<maxh<<endl;
}
return 0;
}
1007.8皇后问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
输出8皇后问题所有结果。
输入
没有输入。
输出
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。
输入样例
输出样例
输出的前几行:
No 1:
A.......
....A...
.......A
.....A..
..A.....
......A.
.A......
...A....
No 2:
A.......
.....A..
.......A
..A.....
......A.
...A....
.A......
....A...
提示
输出样例是正确输出结果的前几行。
//输出八皇后问题的所有结果
//每行只能放一个皇后可以 放在满足条件的第几列上面
//注意局部变量和全局变量尽量别取相同,避免发生错误
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int sum=1;
int a[9];
int i,j;
int canset(int x,int y)//检验第m行第i列是否能够放置
{
//不能同行同列主次对角线上
//同列知
//主 14 25
for(int i=1;i<x;i++)
{
if(a[i]==y||abs(x-i)==abs(a[i]-y)||x+y==a[i]+i)
{
return 0;
}
}
return 1;
}
void dfs(int m)
{
if(m>8)
{
cout<<"No "<<sum<<":"<<endl;
sum++;
for(i=1;i<=8;i++)
{
for(j=1;j<=8;j++)
{
if(a[i]==j)
{
cout<<"A";
}
else
{
cout<<".";
}
}
cout<<endl;
}
return;
}
else
{
for(int k=1;k<=8;k++)
{
if(canset(m,k))
{
a[m]=k;//放置
dfs(m+1);
a[m]=0;
}
}
}
}
int main()
{
memset(a,0,sizeof(a));
dfs(1);
return 0;
}