问题 E: 【递归】冲突

题目描述
监狱的每间牢房是一个不超过4×4的正方形,里面设有一些障碍,牢房里住着的犯人脾气都很大,只要两个犯人位于同一行或同一列即会发生冲突,但障碍物可以阻挡同行或同列犯人的冲突。问最多可放几个犯人而不会发生冲突。如下图所示,左边表示初始牢房样,右边4个显示了摆放方案,当然,最后两个方案是错误的。

在这里插入图片描述
输入
有多组测试数据,每组数据第一行为一个整数N表示牢房大小。随后N行描述牢房,其中X表示障碍。

所有测试数据结束的标志为0。

输出
输出最多可放的犯人数。

样例输入
4
.X…

XX…

2
XX
.X
3
.X.
X.X
.X.
3

.XX
.XX
4




0
样例输出
5
1
5
2
4
这题就是逐一尝试吧

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
char s[6];
int a[6][6];
int b[6][6];
int t=0;
int fun(int a[][6],int n,int ans)
{
	if(ans>t){
		t=ans;
		return 0;
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(a[i][j]==1){
				
				for(int p=0;p<n;p++)
					for(int q=0;q<n;q++)
						b[p][q]=a[p][q];
				int f=1;
				for(int k=j+1;k<n&&b[i][k]!=0;k++)
					if(b[i][k]==2){
						f=0;
						break;
					}
				for(int k=j-1;k>=0&&b[i][k]!=0;k--)
					if(b[i][k]==2){
						f=0;
						break;
					}
				for(int k=i+1;k<n&&b[k][j];k++)
					if(b[k][j]==2){
						f=0;
						break;
					}
				for(int k=i-1;k>=0&&b[k][j];k--)
					if(b[k][j]==2){
						f=0;
						break;
					}
				if(f==1){
					b[i][j]=2;
					fun(b,n,ans+1);
				}
			}
		}
	}
}
int main()
{
	int n;
	int w[100][100];
	while(cin>>n&&n){
		for(int i=0;i<n;i++){
		cin>>s;
		for(int j=0;s[j];j++)
			if(s[j]=='X') a[i][j]=0;
			else a[i][j]=1;
		}
		t=0;
		
		fun(a,n,0);
		
		printf("%d\n",t);
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/85341954