• POJ 1321 棋盘问题


    http://poj.org/problem?id=1321

    棋盘问题
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 22332   Accepted: 11084

    Description

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

    Input

    输入含有多组测试数据。
    每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
    当为-1 -1时表示输入结束。
    随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

    Output

    对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

    Sample Input

    2 1
    #.
    .#
    4 4
    ...#
    ..#.
    .#..
    #...
    -1 -1
    

    Sample Output

    2
    1
    自己的代码,好长,825MS 
    
    //棋盘问题 POJ1321
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char map[10][10];
    int vis[10][10];
    int n, k, sum;
    struct point
    {
    	int xx,yy,step;
    }st;
    
    void dfs(point st);
    int main()
    {
    	while (~scanf("%d %d", &n, &k) && n != -1 && k != -1)
    	{
    		int i, j;
    		sum = 0;
    		memset(vis, 0, sizeof(vis));
    		memset(map, 0, sizeof(map));
    
    		for (i = 1; i <= n; i++)
    		{
    			for (j = 1; j <= n; j++)
    			{
    				scanf(" %c", &map[i][j]);
    			}
    		}
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				if(map[i][j] == '#')
    				{
    					st.xx = i;
    					st.yy = j;
    					st.step = 0;
    					dfs(st);
    				}
    			}
    		}
    		printf("%d
    ",sum);
    	}
    
    	return 0;
    }
    
    void dfs(point st)
    {
    	int i,j;
    	int x = st.xx, y = st.yy;
    	int t = ++st.step;
    	//printf("x = %d,y = %d,t = %d
    ",x,y,t);
    	if(t==k)
    	{
    		sum++;
    		return;
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			if(i==x||j==y)
    			{
    				vis[i][j]++;
    			}
    		}
    	}
    	for(i=x+1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			if(map[i][j] == '#' && !vis[i][j])
    			{
    				//printf("haha i=%d,j=%d
    ",i,j);
    				st.xx = i;
    				st.yy = j;
    				dfs(st);
    			}
    		}
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			if(i==x||j==y)
    			{
    				vis[i][j]--;
    			}
    		}
    	}
    }
    

    大神的代码,47MS

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char chess[10][10];
    int col[10];
    int n,m,ans;
    void dfs(int row,int num)
    {
    	int i,j;
    	if(num==m)
    	{
    		ans++;
    		return;
    	}
    	for(i=row+1;i<=n;i++)
    		for(j=1;j<=n;j++)
    			if(chess[i][j]!='.' && !col[j])
    			{
    				col[j]=1;
    				dfs(i,num+1);
    				col[j]=0;
    			}
    
    }
    int main()
    {
    	int i;
    	while(cin>>n>>m)
    	{
    		ans=0;
    		if(n==-1 && m==-1)break;
    		memset(col,0,sizeof(col));
    		for(i=1;i<=n;i++)
    			cin>>chess[i]+1;
    		dfs(0,0);
    		cout<<ans<<endl;
    	}
    	return 0;



    www.cnblogs.com/tenlee
  • 相关阅读:
    mysql高级排序&高级匹配查询示例
    为什么我说我会这会那,但真正到回答实际问题的时候却傻了眼了?
    微软职位内部推荐-SW Engineer II for WinCE
    微软职位内部推荐-Senior Program Manager
    微软职位内部推荐-Software Engineer II-Web app
    微软职位内部推荐-Senior Software Engineer -Web
    微软职位内部推荐-Senior Software Engineer-News
    微软职位内部推荐-Software Engineer II-News
    微软职位内部推荐-SDE II
    微软职位内部推荐-Software Engineer II-Data Mini
  • 原文地址:https://www.cnblogs.com/tenlee/p/4420147.html
Copyright © 2020-2023  润新知