补上:1<=n<=10 0<=k<=n*n 范围蛮小的……俺用穷举来做。。。
#include <stdio.h>
#include <string.h>
int cnt;
int n,k;
char d;
int canput(int pos)
{
int x,y,i;
x=pos%n;
y=pos/n;
for (i=0;i<x;i++) if (d==1) return 0;
for (i=0;i<y;i++) if (d==1) return 0;
return 1;
}
void exe(int pos,int count)
{
if (count==k) {cnt++;return;}
if (pos==n*n) return;
if (canput(pos))
{
d=1;
exe(pos+1,count+1);
d=0;
exe(pos+1,count);
}
else exe(pos+1,count);
return;
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
cnt=0;
memset(d,0,100);
exe(0,0);
printf("%d\n",cnt);
}
}
简单得测试了几个数据。。。
不知道正不正确。
呵呵,正确,但不是最佳算法. 动态规划可能快一点。
ACM题一
我也来一题:在n*n的方格中放入k个棋子,要求任意两个棋子不能相邻,即不能这样放:
●●或●□但可以这样放:●□或□●
□□ ●□ □●●□
求出共有几种放法?
例如:输入:n=4,k=4
输出:24
hehe
是8皇后问题么? 我的想法是n*n的矩阵,有子为1无子为0
下一个棋子的位置循环起始为上一个棋子位置+2
判定标准为每一个棋子-n没有被占用
就是不知道执行起来效率怎么样 感觉用a来表示棋子的位置好点,判定方法一样,中午吃饭的时候写个试试,嘿嘿
对了,FF里面发帖的时候看不到右边的默认表情~囧
唉,没注意到是坟……大家保重
[ 本帖最后由 Still4 于 2010-7-26 11:32 编辑 ]
页:
[1]