uva 639 Don't Get Rooked ( 回溯 )

这道题确实是标准的回溯,果然还是早上比较清醒一些,昨天晚上想了好长一会儿都没有想起来,早上一会的功夫就A

了,估计也有昨天晚上的帮助。。。总感觉不想写太多私人的东西在这上面,因为这个是每个人都可以无条件访问的。。。

思路:

由于数据比较小,可以把每个元素都遍历一遍,回溯选择,最多4*4,还是很小的,我交的才1ms,1A。。

贴代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int map[10][10];
int visit[10][10];
int row[10];//用来判断该行是否可以放置
int col[10];//用来判断该列是否可以放置
int max,cnt,n;
void solve(int x,int y)//x,y表示将要访问的行数和列数
{
	for(int i=x; i<=n; i++)
	{
		for(int j=y; j<=n; j++)
		{
			if(map[i][j] == 'X')//如果有墙了,就说明这一行和这一列以后可以放置了
			{
				row[i] = 0;
				col[j] = 0;

			}
			else if(visit[i][j] == 0 && col[j] == 0  && row[i] == 0)//没有访问过+该行可以访问+该列可以访问
			{
				cnt++;
				if(cnt > max)
					max = cnt;
				visit[i][j] = 1;
				row[i] = 1;
				col[j] = 1;
				if(x<n && y<n)
					solve(x, y+1);
				else if(x<n && y==n)
					solve(x+1, 1);
				else if(x == n && y < n)
					solve(x,y+1);
				else if(x == n && y == n)
					return ;
				visit[i][j] = 0;// 回溯
				row[i] = 0;//回溯
				col[j] = 0;//回溯
				cnt--;//回溯
			}
		}
	}
	return ;
}
int main()
{
	int i,j;
	while(scanf("%d",&n),n!=0)
	{
		memset(visit,0,sizeof(visit));
		memset(row,0,sizeof(row));
		memset(col,0,sizeof(col));
		memset(map,'\0',sizeof(map));
		getchar();
		for(i=1; i<=n; i++)
		{
			for(j=1; j<=n; j++)
			{
				scanf("%c",&map[i][j]);
			}
			getchar();
		}
		max = 0;
		cnt = 0;
		solve(1,1);
		printf("%d\n",max);
	}
	return 0;
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 639 Don't Get Rooked ( 回溯 )

时间: 2024-10-10 06:51:29

uva 639 Don't Get Rooked ( 回溯 )的相关文章

uva 639 Don&#39;t Get Rooked (暴力回溯 )

uva 639 Don't Get Rooked In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this problem we will consider small chess boards (at most 44) that can also contain walls through which rooks cannot move. The g

UVa 639 - Don&#39;t Get Rooked

题目:在n*n的方格里,放入几个喷火器,他们会攻击同行.同列的点,问做多能放多少个. 分析:图论,搜索,二分图匹配.本题可以利用搜索求解,这里我使用的是二分图匹配. 建图,把原图每行每列的不同的连续区间分别看成一个新图中的点xi与yj: 则边<xi,yj>表示原图中对应位置的点,原图中可以互相攻击的点就对应到新图中相同的xi与yj: 则新图中的二分图最大匹配即为,原图中不能相互攻击的最大摆放数量. 说明:图论关键就是建图. #include <iostream> #include

Don&#39;t Get Rooked UVA 639(八皇后问题变形)

说说: 这道题目类似于八皇后问题.有n*n的正方形棋盘,且n<=4.例如在n=4时,有下图所示的棋盘,其中每两个棋子不能放在同一行或者同一列,除非有围墙(黑色的格子)将它们隔开.求给定的棋盘,能放下的最多的棋子数目. 分析: 在八皇后问题中,我们对整个棋盘分成八行考虑的,每行插入一个棋子.所以对于这道题目解决方案也类似,同样是一行一行插入.但是与八皇后问题不同的是,本题中棋盘一行可能插入多个棋子,也可能没有棋子.所以在递归函数中,不仅要给出所要处理的行的信息,也要给出所要处理的列的信息,其实就是

UVa 524 Prime Ring Problem【回溯】

题意:给出n,把从1到n排成一个环,输出相邻两个数的和为素数的序列 照着紫书敲的, 大概就是这个地方需要注意下,初始化的时候a[0]=1,然后dfs(1),从第1个位置开始搜 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<m

UVa 639 放车问题

题意:给定一个 n x n 的棋盘,在上面放置车.其中.号表示可放置,X表示墙.在同一行或同一列的两个车,如果它们之间没有X墙挡着,则是不合法的放置.给定一棋盘,最多可以放置车的数量. 思路:枚举所有的格子,看是否可以在此放置.每次放一个车后,修改棋盘的横行.竖列直到X的位置为1,即不可放置.因为要修改棋盘,所以需拷贝一个过来,修改拷贝的.还有一些注意的,如注释,总感觉写得不是很简洁. 还有就是,二维数组做参数时,可以用 char b[][5],  或者 char (*b)[5].但不能是 ch

UVa 524 Prime Ring Problem (回溯)

第一次无指导写的回溯. 感觉也不难,小紫书上说"学习回溯短则数天,长则数月或一年以上", 但我没用一小时就懂了回溯,不知道是真懂还是假懂. 这道题很简单.细心就好. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int n, ans[25]; const int pn[] = {1,

uva 331 Mapping the Swaps (回溯)

uva 331 Mapping the Swaps Sorting an array can be done by swapping certain pairs of adjacent entries in the array. This is the fundamental technique used in the well-known bubble sort. If we list the identities of the pairs to be swapped, in the sequ

UVA - 639

  Don't Get Rooked  In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this problem we will consider small chess boards (at most 44) that can also contain walls through which rooks cannot move. The goal i

UVa 524 Prime Ring Problem(回溯法)

传送门 Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers 1, 2, . . . , n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle sho