639UVa棋盘放车

来源:互联网 发布:2017编程笔记本 编辑:程序博客网 时间:2024/06/03 16:44

回溯关键:

逐步对各个点进行放置

#include<stdio.h>#include<string.h>char gra[6][6];int n;int maxnum;bool judge(int r,int c){int flag = true;int j = c;while(j-1>=0){j--;if(gra[r][j] == 'X')break;else if(gra[r][j]=='r')flag = false;}j =c;while(j+1 < n){j++;if(gra[r][j] == 'X')break;else if(gra[r][j]=='r')flag = false;}int i = r;while(i-1>=0){i--;if(gra[i][c] == 'X')break;else if(gra[i][c]=='r')flag = false;}i = r;while(i+1 < n){i++;if(gra[i][c] == 'X')break;else if(gra[i][c]=='r')flag = false;}return flag;}void search(int k,int m,int sum){//怎么结束?if(k == n){if(sum > maxnum){maxnum = sum;}return;}int i = k, j = m;for(i = k; i < n;i++){if(i != k) j = 0;  //for(; j < n;j++){if(gra[i][j] == '.' && judge(i,j)){gra[i][j] = 'r';if(j == n-1)search(i+1,0,sum+1);else search(i,j+1,sum+1);gra[i][j] = '.';}}}//if(i*n+j >= n*n){if(sum > maxnum){maxnum = sum;}}}int main(){//freopen("input.txt","r",stdin);while(scanf("%d",&n)==1 && n){memset(gra,0,sizeof(gra));for(int i = 0;i < n;i++){scanf("%s",gra[i]);}maxnum=0;for(int i = 0; i < n;i++){for(int j = 0; j < n;j++){if(gra[i][j] == '.')search(i,j,0);}}printf("%d\n",maxnum);}}


0 0
原创粉丝点击