1006堡垒问题&&1007八皇后问题

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

猜你喜欢

转载自blog.csdn.net/rain699/article/details/84069926