Untitled

 avatar
unknown
plain_text
2 years ago
1.1 kB
2
Indexable
#include<iostream>
using namespace std;
char M[4][4];
int N;
int ans =0;
bool check(int r,int c)
{
	if(M[r][c] == 'X') { return false;}
	for(int i=c-1; i>=0; i--)
	{
		if(M[r][i] == 'C') {return false;}
		if(M[r][i] == 'X') {break;}
	}
	for(int i=r-1; i>=0; i--)
	{
		if(M[i][c] == 'C') {return false;}
		if(M[i][c] == 'X') {break;}
	}
	return true;
}
void backtrack(int k)
{
	if(k == N*N) {
		int count_ =0;
		for(int i=0; i<N; i++)
		{
			for(int j=0; j< N; j++)
			{
				if(M[i][j] == 'C') { count_ ++;}
			}
		}
		if(count_ > ans ) { ans = count_;}
		return ;
	}
	if(check(k/N,k%N))
	{
		for(int i=0; i<2; i++)
		{
         if(i==0) backtrack(k+1);
		 else{
			 M[k/N][k%N] = 'C';
			 backtrack(k+1);
			 M[k/N][k%N] = '.';
		 }
		}
	}
	else backtrack(k+1);


}
int main()
{
	int t;
	cin >> t;
	for(int stt=1; stt <=t; stt ++)
	{
		cin >> N;
		for(int i=0; i<N; i++)
		{
			for(int j=0; j<N; j++)
			{
				cin >> M[i][j];
			}
		}
		///////////////////
		backtrack(0);
		cout << "Case #" << stt << endl << ans << endl;
		ans =0;
	}
}